{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pairk - tutorial notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook will go over the basics of how to use the pairk library using an example set of sequences (comes pre-installed with pairk)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "some text copied from the documentation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pairk is a Python package for quantifying the conservation of motifs within intrinsically disordered regions (IDRs). It will run on any input protein sequences that you provide but it is designed for disordered regions, where multiple sequence alignments are particularly difficult to interpret and unreliable\n",
    "\n",
    "the pairk method can be split into 2 steps, where each step has configurable options:\n",
    "\n",
    "**Step 1: pairwise k-mer alignment**\n",
    "- aligns all of the k-mers in the query sequence to all of the k-mers in the homolog sequences. For each query k-mer, the best matching k-mer from each homolog is selected and recorded. The results are returned in a `PairkAln` object which provides methods for accessing the results and writing/reading the results to/from files.\n",
    "- The way in which the best matching query k-mer - homolog k-mer match is selected is adjustable. The currently implemented methods use either scoring matrices to score the match or use residue embedding distances from the ESM2 protein language model to score the match. Both methods are described in detail below\n",
    "\n",
    "**Step 2: k-mer conservation**\n",
    "- calculates conservation scores for each query k-mer using the results of Step 1. The conservation score results are stored in a `PairkConservation` object which also provides methods for plotting the results as well as writing/reading the results to/from files.\n",
    "- The function used to score the conservation is adjustable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "make sure that pairk is installed before running this notebook (see the README.md file for installation instructions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## import"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Most of the functionality of pairk is accessed through the main pairk module, which can be imported directly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pairk"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## load example data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pairk comes with some example data that we can use to test the methods. The example data is stored in the ``pairk.example1`` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "ex1 = pairk.example1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example is imported as a python object and holds data that is compatible with the main pairk methods\n",
    "\n",
    "for example, we can access the IDR sequences in a dictionary with ``ex1.idr_dict``\n",
    "or the query id with ``ex1.query_id``"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9606_0:00294e TNLGTVNAAAPAQPSTGPKTGTTQPNGQIPQATHSVSAVLQEAQRHAETSKDKKPALGNHHDPAVPRAPHAPKSSLPPPPPVRRSSDTSGSPATPLKAKGTGGGGLPAPPDDFLPPPPPPPPLDDPELPPPPPDFMEPPPDFVPPPPPSYAGIAGSELPPPPPPPPAPAPAPVPDSARPPPAVAKRPPVPPKRQENPGHPGGAGGGEQDFMSDLMKALQKKRGNVS\n",
      "9793_0:005123 TNVGTGNAATPAPPSTGLKTGTAQANGQIPQAAHSVSTVLNEADRQVDTPKDKKPALSNHDPGTPRAQHLPKSSLPPPPPVRRSSDTSSSPVMPAKGAAGGLPPLLDDSLPPPPPPPPLEDDELPPPPPDFDDAPPNFVPPPPPWDAGASLPPPPPPPPPALALAPEATKPSPVVAKRPPVPPKRQENPAPASGGGGGEQDFMSDLMKALQKKRGNVA\n",
      "1706337_0:000fc7 TNLGTVNAAPPAPSSTGVKTGTTQANGQIPQAAHSMSTVLGEAQRQVETTKDKKSGLGSHDPGAPRAQTLPKSSLPPPPPVRRSSEVGCGSPGTSPKVKGAAAGFPAPPHDLLPPPPPPPPLEDDELPPPPPDFSDAPPDFVPPPPPPSFAGDAGSSLPPPPPPPALAPEAAKPTPVVVKRPPAPPKRQANPGPPGGGGGEQDFMSDLMKALQKKRSNMP\n",
      "51337_0:001b5a TNLGTVNTATPAQPSTGFKTGSSQPNGQIPQTIPSVSAGLQEAQRHETIKDKKPSLSSTEPGAPRDPPGARSSLPPPPPPVRRSSDTCARAASPFPAPPDDLPPPPPPPPLEDPAMLPPPPALPEPPPDCVPPPPPPPGPGPQPARPSPGAGRRPPVPPKRQENPGLPSAGAGGEQDFMSDLMKALQKRGHMP\n",
      "9568_0:004ae1 TNLGTVNAAAPAQPSTGPINGTAQPNGQMPQAAHSVSAVLQEAQRHAETSKVKPARPINGTAQPNGQMPQAAHSVSAVLQEAQRHAETSKRPSPAVAKRPPMPPKRHENPGTPSGAGGGEQDFMSDLMKALQKKRGNVS\n",
      "43346_0:004190 TNLGTVNAVPPAPPSTGVKTGTTQANGQLPQATQSMNTALGEDWRQLETTKDKKPGPGLGSHDPGAPRAQPLPKSSLPPPPPPVRRSSDVGGAPPPSFAEDLPPPPPPPPALAPESVRTPPVVVKRPPPPPKRQENPGPPGGGGGEQDFMSDLMKALQKKRGNVS\n",
      "885580_0:00488c TNLGTVNTAAAAQPPAGLRTGTSQPNGQLPRDAPCLSDALRESQRQADTSKVGPEGQGGHELPDRPKAAFQASTALAASPYSPKH\n",
      "10181_0:00305d TNLGTVSTATAAQPPTGLRTSTTQHNGQLPQAAPHLSAVLQEAQRQAEASKVGPEGNRPKLQQISAPSPPSKPEAVFWHLLLFPASENPPYCNFT\n",
      "1415580_0:000900 PNLSKVDPTVTARSSSSGAVQANGQIHQNVIPVISTNPEAFKRAEDKKPNVGRKPDQAQLQPVPSSNHQQSPKVALHASKIPPPAPARISSQAYSSALTLPSNVKNVNANVLLPPPPSPSPPPPDAFPLPPPCNNDLPPPPDDFYDPPPDFLPPPPPCFATGDRAQLPPGPPLPPPPPSSNQPKPFMKKPVPLPPKRQDITSLHSEQPSLAGPTPVGGGGGQPDFMSDLMKALQKKRGSTS\n",
      "61221_0:00105a AKSGNTESIVAVGTSAKGSTHANGQVPQSITLSKTDSSETGKSAEMPKVKKPDNTADSIQAPTPNTPQLKHQRKAGGSHSAPPMPPQRVSSAVTAPLQLPTNAEGKGKVCPSDAAEFPPPPESMLPPPELEDLPLPPPPPPEYFESPPDFIPPPPPSCAVAVSAGAPPLPPPPPSASLPRMPLSIKKKPPPPPRRQEESAGQAGLPKPSAPPPKTETAGQGDFMSDLMKALEKKRGATS\n",
      "7897_0:0033c5 ANFAKVQSQNTTASSTGSVQANGHAGQVTPVSVSFSEAWKRGDVGKEKQSNDGQDNLPPPPPPPPPPMQGFMNEAFPPPPSLPPIASGSLPPPLRASASAPAPPPISNNFPPPLDELSPPPDDFDFPEPPPDFLPPPPTVSASGVPPPPPPPPPPPAPTAASQPTPLPKKSVPPRRQENTTLSQPRGGGGGGQPDFMSDLTKALQKKRGNAS\n",
      "8407_0:002bff SSLSSSTTPTGAPQGNGQISQNVANVSSSFSDAWKRGETAKDKQQPTEVRKPEQKISLPPSTKQPPPAPVRRPSNAHVVGTPPLPIKAKPVTSNMPPPPPPAEASQWGDDFLPPPPPPELLDTPPNFLPPPPPSFNSESDYPAPPQFTNVGSAGGPPPPPPPPPPPPAALSPKSAPPQLPVKKLPPKPPMRRDSTGQRPNQQNSLMTNGGGAGGQPDFMSDLMSALQKKRSTTT\n",
      "173247_0:004550 MNRSTPSSSNPSTPSPTIKAKTPNQANGHAPKPQPTAPDSMDFGNFPPPPSADILPPPPPDPAFPPPPPSLPAKSSSRPVAPQHKLPANFPPPPMAMDNLPPPPLPPPIDDSPEAPPDFLPPPPPAAGFGSLPPPPLSMNSLPPPPHFGGMDQSLPPPPPDPEFLPPPPPEPVFTGAGAPPPPPPPPPPPPAQAAAVPRAPVRPSGSVRKVPPAPPKRTTPSLQVGGGGGGGDFMSELMVAMQKKRGDH\n",
      "30732_0:0046dd TNRSTPSSSNPSTPSPTVKAKAQSQANGHAPKPQPGPVSQDFGHLPPPPPPCPNDDLPPPPPDPVFPPPPPPLAAKRSPKTAGRSQHPQGNFPPPPPEMDHLPPPPPMEESPPDFLPPPPPMNSLPHPPPPPASFGGVDHSLPPPPPDPEFLPPPPPDPQVTGGGGPPPPPPPPPPPPPASAPAPRGALRPTGSAKKMPPAPPKRTTPVMGGGGGGGGGGGGDFMSELMKAMQKKRSDQ\n",
      "241271_0:0048e4 TNRTPVSSNQSTPSPTIKAKSPNQANGHAAKPQPGPESQDFGNIPPPPPPPPPPMTGFLPPPPPDPVLPPPPPLLAAKSPKPSPPQRNLPTNFPPPAMDNLPPPPPPPMDDSFEDPPDFLPPPPPAAGFGSLPPPPPPVNSFPPPPPSAGFGGMGQSLPPPPPDPGFLPPPPPQPMFTGGGTIPPPPPPPPPPTAAPRAPVRPTGSVKKAPPAPPKRTTPSLHGGGGGGGGGGGDFMSELMMAMNKKRGTT\n",
      "8103_0:0045e4 TNRSTPSSSNPSTPSPPIKAKSPGQANGHALKPEPGPVAQDFGHVPPPPPADILPPPADILPPPPPQTFLPPPPPPLAAKSSSKPSLPQRHLPTNFPPPPPAMINLPRPPQPPPTDDASEAPPDFLPPPPPAAGFSPLFPPPPPLNALPLPPPPVSFRVEDRSLPPPPPDPGFLPPPPPMFTGAGAPPPPPPPPPPPRVAVRPAGSVKKRPPAVPKRTTPSLRGGGGGDFMSELALAMNKKRSAH\n",
      "56723_0:00152f TNRSTPSSSSSSTPSPTIKAKSPSQANGHAPKPQPGPVSQDFGNVPPPPPPMANILPPPRPDAFLPPAPPPLARKNSAKPPPPQRHLPTNFPPPPPAMDNLPPPPPPPPMDDALEAPPDFLPPPPPAAGFGSLPPPPPPSNSFPPPPPPGSFGSMGQSLPPPPPDPGFLPPPPPQPVFTGAGAPPPPPPPPPPPTAAAAPRAPVRPSGSVKKIPPATPKRTTPSLQGGGGGGGGGGGGGGDFMSELMLAMNKKRST\n",
      "210632_0:004c0c ANRSTSSSSNSSTPSPTIKAKSSSQANGIFPKPGPAPQDFGDLPPPPPLAANILPPPPPEPGLPPPPPPPPPQAAKGSAKPAPPKRQMPANFPPPPTAMDNLPPPPPPPPIDNSEAPPDFLPPPPPASGFGSFPPPPPLNSLPPPPRPGGFGGMDQSLPPPPPDPEFLPPPPPPPQAVFTGGGAPPPPPPPPPPPAAAAPSTAIPRVGLRPAGSLKKLPPAPPKRTTPSMQGSGGGGGGDFMSELMLAMQKKRGDHP\n",
      "31033_0:00264e TNCSKPSSDGPPTPPTTIKASPANGHVPKPPPGAAPQDVFPPPPPPMDILPPPPPDPAFPPPPPPLMAKRSPKPSAGHRQAPGDHLPPPPLAPPHDDASEDPPDFLPPPPPSFDSLPPPPPGMSAFPPPPPLLGFSETSQPLPPPPPDPELLLPPPPASMISTGAGAPPPPPPPPPAAAASPRPAPTASGSVRKRPPAPPKRTTPALHGSGGGAGEGAGGGDFMSELMKAMNKKRADHS\n",
      "63155_0:004c86 TNRSTPSSSNQSTPSPTVKAKSPNQANGHPPKPQPGPISQAPFPPPPLAEVLPPPPPDPVLPPPPPMPAKSSAKPSPPKRQQQSNFPPPPPELDNLPPPPPPPPTDDTAEAPPDFLPPPPPAVGFGSLPPPPPSFGGVGQSLPPPPPDPQSLPPPPPDPVFIGAGAPPPPPPPPPPPAPGAPVTTLRPAVRPSGSLKKVPPAPPQRNTPSVSGGGGGGGGDFMSELMLAMQKKRGAQ\n",
      "7994_0:004d71 TSMNRQPSPSTSNTSTPSPTPKAKTANGHASQPRSETVPKAPSNQSAFPPPPPPADFLPPPPPDPTLPPPPPPPPALPVKKESNPPRSAPQRSQPAFPPPPPAMDFSLPPPPPPSDDLEMPPDFLPPPPPAPGGFMGGDLLPPPPPEPFHAPLPPPPAAFHPPPAVHPPPQATGGDLPPPPPPPPPPPPAPAAFHQTPSVRKVGPPPPKRTTPSLAAPSGGDFMSELMLAMNKKRGGQ\n",
      "109280_0:00369f ASCSVTSGQKQSQSQVANGHANNTSPSPLPPPPPPLGEDLPPPPPPPPQLGKTLPPAPPPLGATLPTPPPPPGGTPPPPPPPRRNPPPYPRHLPHISELYPLRRLLLLYQLPTVHSLVLLFQPNLPPNPSPNHDVQRPISRCLPGPQITFPPPPPPPVDDSPPDFLPPPPPAANFGSHPPPPPPVKTLPPPPPHMKTLPPARLSFKSTNLPPPPPDPGFLPPPLTGVPPPPPPPPPPPPTTAAAGPRRAPVRPSGSLKKMPPPPPKRSTPSLHGRRDGDRGDGDGGGGGDFMSELMRAMQKKRDPH\n",
      "150288_0:004e5a HPPDRCSTSSDNLNSQIGQSAPTPDECIEQDEPPPDFIPPPPPGYMAIL\n"
     ]
    }
   ],
   "source": [
    "for id, seq in ex1.idr_dict.items():\n",
    "    print(id, seq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9606_0:00294e\n"
     ]
    }
   ],
   "source": [
    "print(ex1.query_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step 1: pairwise k-mer alignment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "there are 2 main ways to run the k-mer alignment step:\n",
    "\n",
    "* **Scoring matrix alignment**\n",
    "\n",
    "   * These methods use a scoring matrix to score the query k-mer to homolog k-mer matches and select the best scoring match from each homolog.\n",
    "\n",
    "* **Embedding distance alignment**\n",
    "\n",
    "   * This method uses the Euclidean distance between the query k-mer residue embeddings from a protein large language model (such as ESM2) and homolog k-mer residue embeddings and selects the lowest distance match from each homolog.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Scoring matrix alignment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are 2 implementations of the scoring matrix method:\n",
    "\n",
    "* `pairk.pairk_alignment` - the original implementation. This is a bit slow because it does an exhaustive comparison of all k-mers in the query sequence with all k-mers in the homologs.\n",
    "\n",
    "* `pairk.pairk_alignment_needleman` - a faster implementation that uses the Needleman-Wunsch algorithm (as implemented in Biopython) to align the k-mers. This is faster and should yield the same results."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "inputs common to both functions are:\n",
    "\n",
    "* ``idr_dict``: a dictionary of IDR sequences, where the keys are the sequence ids and the values are the sequences. Includes the query sequence (the sequence to split into k-mers and align with the homologs).\n",
    "* ``query_id``: a query sequence id (the sequence to split into k-mers and align with the homologs). This id should be present in ``idr_dict``.\n",
    "* ``k``: the length of the k-mers\n",
    "\n",
    "These inputs can be generated many ways, and there are helper functions in the pairk library to help with this (see functions in ``pairk.utilities``). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Scoring matrix - `pairk.pairk_alignment` - slower"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mSignature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairk_alignment\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0midr_dict\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mquery_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mmatrix_name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'EDSSMat50'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairwise_tools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkAln\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m\n",
      "run pairwise k-mer alignment method using an exhaustive comparison of k-mers.\n",
      "Each query k-mer is scored against each ortholog k-mer to find the best matching\n",
      "ortholog k-mer in each ortholog. If a ortholog IDR is shorter than the k-mer, a\n",
      "string of \"-\" characters (\"-\"\\*k) is assigned as the best matching ortholog k-mer for that\n",
      "ortholog.\n",
      "\n",
      "**Note**: if there are multiple top-scoring matches, only one is returned.\n",
      "\n",
      "Parameters\n",
      "----------\n",
      "idr_dict : dict[str, str]\n",
      "    input sequences in dictionary format with the key being the sequence id and\n",
      "    the value being the sequence as a string\n",
      "query_id : str\n",
      "    the id of the query sequence within the `idr_dict` dictionary\n",
      "k : int\n",
      "    the length of the k-mers to use for the alignment\n",
      "matrix_name : str, optional\n",
      "    The name of the scoring matrix to use in the algorithm, by default \"EDSSMat50\".\n",
      "    The available matrices can be viewed with the function `pairk.print_available_matrices()`.\n",
      "\n",
      "Returns\n",
      "-------\n",
      "pairwise_tools.PairkAln\n",
      "    an object containing the alignment results. See the `pairk.PairkAln` class for more information.\n",
      "\u001b[0;31mFile:\u001b[0m      ~/pairk_repo/pairk/backend/kmer_alignment/scoring_matrix.py\n",
      "\u001b[0;31mType:\u001b[0m      function"
     ]
    }
   ],
   "source": [
    "pairk.pairk_alignment?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "aln_results = pairk.pairk_alignment(\n",
    "    idr_dict=ex1.idr_dict,\n",
    "    query_id=ex1.query_id,\n",
    "    k=5,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To specify the scoring matrix used, you can pass the name of the matrix to the ``matrix_name`` argument.\n",
    "\n",
    "To see the available matrices, use the `pairk.print_available_matrices()` function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "biopython-builtin matrices (aligner compatible):\n",
      "BENNER22\n",
      "BENNER6\n",
      "BENNER74\n",
      "BLASTN\n",
      "BLASTP\n",
      "BLOSUM45\n",
      "BLOSUM50\n",
      "BLOSUM62\n",
      "BLOSUM80\n",
      "BLOSUM90\n",
      "DAYHOFF\n",
      "FENG\n",
      "GENETIC\n",
      "GONNET1992\n",
      "HOXD70\n",
      "JOHNSON\n",
      "JONES\n",
      "LEVIN\n",
      "MCLACHLAN\n",
      "MDM78\n",
      "MEGABLAST\n",
      "NUC.4.4\n",
      "PAM250\n",
      "PAM30\n",
      "PAM70\n",
      "RAO\n",
      "RISLER\n",
      "SCHNEIDER\n",
      "STR\n",
      "TRANS\n",
      "\n",
      "other matrices:\n",
      "EDSSMat50\n",
      "BLOSUM62\n",
      "grantham_similarity_norm\n",
      "__init__\n",
      "grantham\n",
      "grantham_similarity_normx100_aligner_compatible\n"
     ]
    }
   ],
   "source": [
    "pairk.print_available_matrices()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Scoring matrix - `pairk.pairk_alignment_needleman` - faster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mSignature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairk_alignment_needleman\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0midr_dict\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mquery_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0maligner\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mBio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAlign\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairwiseAligner\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mmatrix_name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'EDSSMat50'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairwise_tools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkAln\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m\n",
      "run pairwise k-mer alignment method using the needleman-wunsch algorithm as\n",
      "implemented in Biopython. Each query k-mer is scored against each ortholog\n",
      "k-mer to find the best matching ortholog k-mer in each ortholog. If a ortholog\n",
      "IDR is shorter than the k-mer, a string of \"-\" characters  (\"-\"\\*k) is\n",
      "assigned as the best matching ortholog k-mer for that ortholog\n",
      "\n",
      "**Note**: if there are multiple top-scoring matches, only one is returned.\n",
      "\n",
      "Parameters\n",
      "----------\n",
      "idr_dict : dict[str, str]\n",
      "    input sequences in dictionary format with the key being the sequence id and\n",
      "    the value being the sequence as a string\n",
      "query_id : str\n",
      "    the id of the query sequence within the `idr_dict` dictionary\n",
      "k : int\n",
      "    the length of the k-mers to use for the alignment\n",
      "aligner : Align.PairwiseAligner | None, optional\n",
      "    The Biopython pairwise aligner object to use in the pairwise gapless alignments,\n",
      "    by default None. If None, then an aligner object will be created using the scoring\n",
      "    matrix specified in `matrix_name`. If an aligner object is provided, it will\n",
      "    take precedence over the `matrix_name` parameter, i.e. the `matrix_name` parameter\n",
      "    will be ignored.\n",
      "matrix_name : str, optional\n",
      "    The name of the scoring matrix to use in the algorithm, by default \"EDSSMat50\".\n",
      "    The available matrices can be viewed with the function `print_available_matrices()`\n",
      "    in `pairk.backend.tools.matrices`. If an aligner object is provided,\n",
      "    this parameter **will be ignored**.\n",
      "\n",
      "Returns\n",
      "-------\n",
      "pairwise_tools.PairkAln\n",
      "    an object containing the alignment results. See the `pairk.PairkAln` class for more information.\n",
      "\u001b[0;31mFile:\u001b[0m      ~/pairk_repo/pairk/backend/kmer_alignment/scoring_matrix_needleman.py\n",
      "\u001b[0;31mType:\u001b[0m      function"
     ]
    }
   ],
   "source": [
    "pairk.pairk_alignment_needleman?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This method returns the same results as ``pairk.pairk_alignment``, but it is faster.\n",
    "\n",
    "The difference is that the ``pairk.pairk_alignment_needleman`` method uses the Needleman-Wunsch algorithm to align the k-mers, while the ``pairk.pairk_alignment`` method uses a scoring matrix to exhaustively score the k-mer matches. ``pairk.pairk_alignment_needleman`` ensures that the alignment is gapless by using an extremely high gap opening and extension penalty (-1000000). This will ensure that the alignment is gapless, unless you use a really unusual scoring matrix with very high scores.\n",
    "\n",
    "This method takes similar arguments as ``pairk.pairk_alignment``, accept that the ``pairk.pairk_alignment_needleman`` method takes an optional ``aligner`` argument. This allows you to create the aligner before calling the method, which is useful if you want to do multiprocessing, so that you're not creating a new aligner for each process. I've found that if you create a new aligner for each process, the memory usage gets very high, as if the memory isn't being released until the entire script finishes\n",
    "\n",
    "The ``aligner`` object can be created via the ``pairk.create_aligner`` function. This function takes the name of the scoring matrix as an argument and returns the aligner object. If you don't pass the ``aligner`` argument to the ``pairk.pairk_alignment_needleman`` method, it will create a new aligner using the ``matrix_name`` argument. This is fine if you're not doing multiprocessing. If you are doing multiprocessing, I would suggest creating the aligner before calling the method. If the ``aligner`` argument is passed, the ``matrix_name`` argument is ignored.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "aligner = pairk.make_aligner('EDSSMat50')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "aln_results_needleman = pairk.pairk_alignment_needleman(\n",
    "    idr_dict=ex1.idr_dict,\n",
    "    query_id=ex1.query_id,\n",
    "    k=5,\n",
    "    aligner=aligner\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "results are the same as the `pairk.pairk_alignment` method in this case"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(aln_results.position_matrix == aln_results_needleman.position_matrix).all().all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Embedding distance alignment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This method uses the Euclidean distance between the query k-mer residue embeddings and homolog k-mer residue embeddings and selects the lowest distance match from each homolog. For each homolog, it calculates the distance between the query k-mer and each k-mer in the homolog. It then selects the k-mer with the lowest distance as the best match."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### embedding distance - `pairk.pairk_alignment_embedding_distance`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mSignature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairk_alignment_embedding_distance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mfull_length_sequence_dict\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0midr_position_map\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mquery_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mmod\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mesm_tools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mESM_Model\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mdevice\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'cuda'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mprecomputed_embeddings\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m\n",
      "run pairwise k-mer alignment method using sequence embeddings from the\n",
      "ESM2 protein large language model to find the best k-mer matches from each\n",
      "homolog. If a ortholog IDR is shorter than the k-mer, a string of \"-\"\n",
      "characters (\"-\"\\*k) is assigned as the best matching ortholog k-mer for that\n",
      "ortholog\n",
      "\n",
      "**Note**: if there are multiple top-scoring matches, only one is returned.\n",
      "\n",
      "Sequence embeddings are calculated for each full length sequence in the\n",
      "input dictionary. The `idr_position_map` dictionary is used to extract the\n",
      "IDR and the IDR embeddings from each sequence. The Euclidean distance is\n",
      "calculated between each query k-mer embedding slice and each ortholog k-mer\n",
      "embedding slice to find the best matching ortholog k-mer from each ortholog.\n",
      "\n",
      "\n",
      "Parameters\n",
      "----------\n",
      "full_length_sequence_dict : dict[str, str]\n",
      "    input sequences in dictionary format with the key being the sequence id and\n",
      "    the value being the sequence as a string\n",
      "idr_position_map : dict[str, list[int]]\n",
      "    a dictionary where the keys are the sequence ids in `full_length_sequence_dict`\n",
      "    and the values are the start and end positions of the IDR in the sequence\n",
      "    (using python indexing). This is used to slice out the IDR\n",
      "    embeddings/sequences from the full-length embeddings/sequences.\n",
      "query_id : str\n",
      "    the id of the query sequence within the `full_length_sequence_dict` dictionary\n",
      "    and the `idr_position_map` dictionary. The query id must be present in\n",
      "    both dictionaries.\n",
      "k : int\n",
      "    the length of the k-mers to use for the alignment\n",
      "mod : esm_tools.ESM_Model\n",
      "    ESM2 model used to generate the embeddings\n",
      "device : str, optional\n",
      "    whether to use cuda or cpu for pytorch, must be either \"cpu\" or \"cuda\",\n",
      "    by default \"cuda\". If \"cuda\" fails, it will default to \"cpu\". This\n",
      "    argument is passed to the `esm_tools.ESM_Model.encode` method.\n",
      "precomputed_embeddings : None | dict[str, torch.Tensor], optional\n",
      "    a dictionary where the keys are the sequence ids in `full_length_sequence_dict`\n",
      "    and the values are the precomputed embeddings for each sequence. If this\n",
      "    is provided, the function will use these embeddings instead of computing\n",
      "    them.\n",
      "\n",
      "Returns\n",
      "-------\n",
      "pairwise_tools.PairkAln\n",
      "    an object containing the alignment results. See the `pairk.PairkAln`\n",
      "    class for more information.\n",
      "\u001b[0;31mFile:\u001b[0m      ~/pairk_repo/pairk/backend/kmer_alignment/esm_embedding_distance.py\n",
      "\u001b[0;31mType:\u001b[0m      function"
     ]
    }
   ],
   "source": [
    "pairk.pairk_alignment_embedding_distance?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This method generates residue embeddings using the ESM2 protein large language model. \n",
    "\n",
    "Because residue embeddings are used, the inputs are slightly different than the previous methods. \n",
    "\n",
    "The inputs are:\n",
    "\n",
    "* ``full_length_sequence_dict``: a dictionary of full-length sequences, where the keys are the sequence ids and the values are the sequences. This is used to generate the embeddings.\n",
    "* ``idr_position_map``: a dictionary where the keys are the full-length sequence ids and the values are the start and end positions of the IDR in the full-length sequence (using python indexing). This is used to slice out the IDR embeddings/sequences from the full-length embeddings/sequences.\n",
    "* ``query_id``: a query sequence id (the sequence to split into k-mers and align with the homologs). This id should be present in ``idr_position_map`` and ``full_length_sequence_dict``.\n",
    "* ``k`` - the length of the k-mers\n",
    "* ``mod`` - a ``pairk.ESM_Model`` object. This is the ESM2 model used to generate the embeddings. The code for the ESM2 embeddings is adapted from the kibby conservation tool [link](https://github.com/esbgkannan/kibby) DOI: 10.1093/bib/bbac599\n",
    "* ``device`` - whether to use cuda or your cpu for pytorch, should be either \"cpu\" or \"cuda\". (default is \"cuda\"). If \"cuda\" fails, it will default to \"cpu\". This argument is passed to the ``pairk.ESM_Model.encode`` method"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Full length sequences (``full_length_sequence_dict``) are required to generate the embeddings because each embedding is dependent upon the neighboring residues. The embeddings for just an IDR are different than the embeddings for a full length sequences. Thus, the full length embeddings are gathered first, and then the IDR embeddings are sliced out for the k-mer alignment. \n",
    "\n",
    "The ``idr_position_map`` is used to slice out the IDR embeddings, and there must be IDR positions for each sequence in the input sequence set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our example has both of those"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'9606_0:00294e': 'MGESSEDIDQMFSTLLGEMDLLTQSLGVDTLPPPDPNPPRAEFNYSVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQKESLQNQHHSASLQASIFSGAASLGYGTNVAATGISQYEDDLPPPPADPVLDLPLPPPPPEPLSQEEEEAQAKADKIKLALEKLKEAKVKKLVVKVHMNDNSTKSLMVDERQLARDVLDNLFEKTHCDCNVDWCLYEIYPELQIERFFEDHENVVEVLSDWTRDTENKILFLEKEEKYAVFKNPQNFYLDNRGKKESKETNEKMNAKNKESLLEESFCGTSIIVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGTQHKMKYKAPTDYCFVLKHPQIQKESQYIKYLCCDDTRTLNQWVMGIRIAKYGKTLYDNYQRAVAKAGLASRWTNLGTVNAAAPAQPSTGPKTGTTQPNGQIPQATHSVSAVLQEAQRHAETSKDKKPALGNHHDPAVPRAPHAPKSSLPPPPPVRRSSDTSGSPATPLKAKGTGGGGLPAPPDDFLPPPPPPPPLDDPELPPPPPDFMEPPPDFVPPPPPSYAGIAGSELPPPPPPPPAPAPAPVPDSARPPPAVAKRPPVPPKRQENPGHPGGAGGGEQDFMSDLMKALQKKRGNVS',\n",
       " '9793_0:005123': 'MGESNEDIDQMFSHLLGEMDLLTKSLGVDTLPPPDPKPPRAEFNFSVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQRESSQDQLHSASLEKSNFSGAASLGYGADMAIMSTSQYGDELPPPPADPMLDLPLPPPPPEPLSQEEQEAAAKADKIKLALEKLKEAKVKKLVVKVHMNDNSTKSLMVDERQLARDILDNLFEKTHCDCNIDWCLYEIYPELQIERFFEDHENVVEVLSDWTRDTENKVVFLEKEEKYAVFKNPQNFYLDNKGKKESKETNGKMNAKNKESLLEESFCGTSIIVPELEGALYLKEDGKKSWKKRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGTQCKMRYKAPTDYCFVLKHPQIQKESQYIKYLCCDDARTLNQWVTGIRIAKYGKTLYDNYQRAMARAGLASRWTNVGTGNAATPAPPSTGLKTGTAQANGQIPQAAHSVSTVLNEADRQVDTPKDKKPALSNHDPGTPRAQHLPKSSLPPPPPVRRSSDTSSSPVMPAKGAAGGLPPLLDDSLPPPPPPPPLEDDELPPPPPDFDDAPPNFVPPPPPWDAGASLPPPPPPPPPALALAPEATKPSPVVAKRPPVPPKRQENPAPASGGGGGEQDFMSDLMKALQKKRGNVA',\n",
       " '1706337_0:000fc7': 'MGDPGACRLDELMRVSTMGESNEDIDQMFSNLLGEMDLLTQSLGVDTVPPPEPKPPRAEFNYSVGFKDLNESLNALEDQDLDALMADLVADIREAEQRTIQAQKESSQSRPHSASLDIPSFSGAASLGYTANVAAPSINQYEDDLPPPPADPMLDLPLPPPTPEPLSQEEEEAQAKADKIKLALEKLKEAKVKKLVVKVHMNDNSTKSLMVDERQLARDVLDNLFEKTHCDCNVDWCLYEIYPELQIERFFEDHENVVEILSDWTRDTENKVLFLEKEEKYAVFKNPQNFYLDNRGKKESKETNEKMNAKNKESLLEESFCGTSIIVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGIQCKMKYKAPTDYCFVLKHPQIQKESQYIKYLCCDDARMLNQWVTGIRIAKYGKTLYDSYQRAMARAGLASRWTNLGTVNAAPPAPSSTGVKTGTTQANGQIPQAAHSMSTVLGEAQRQVETTKDKKSGLGSHDPGAPRAQTLPKSSLPPPPPVRRSSEVGCGSPGTSPKVKGAAAGFPAPPHDLLPPPPPPPPLEDDELPPPPPDFSDAPPDFVPPPPPPSFAGDAGSSLPPPPPPPALAPEAAKPTPVVVKRPPAPPKRQANPGPPGGGGGEQDFMSDLMKALQKKRSNMP',\n",
       " '51337_0:001b5a': 'MGESNEDIDQMFSTLLGEMDLLTQSLGVDTLPPPDPKPPRAEFNYSVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQKESFQNQSHFAPPETSAHSSAACHGDAAHAASITISQCEGDLPPPPADPVLDLPLPPPPPEPLSQEEEEALAKADKIKLALEKLKEAKVKKLVVKVHMFDNSTKSLMVDERQLARDVLDNLFEKTHCDCSVDWCLYETYPELQIERFFEDHENVVEVLSDWTRDTENKVLFLKKEEKYAVFKNPQNFYLDNKGKKENKETSEKMNAKNKEYLLEESFCGTSVLVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGIQCKMKYKAPTDYCFVLKHPQIQKESQYIRHLCCDDAHTLHQWVMGIRIAKYGKTLYDNYQRAVARAGLASRWTNLGTVNTATPAQPSTGFKTGSSQPNGQIPQTIPSVSAGLQEAQRHETIKDKKPSLSSTEPGAPRDPPGARSSLPPPPPPVRRSSDTCARAASPFPAPPDDLPPPPPPPPLEDPAMLPPPPALPEPPPDCVPPPPPPPGPGPQPARPSPGAGRRPPVPPKRQENPGLPSAGAGGEQDFMSDLMKALQKRGHMP',\n",
       " '9568_0:004ae1': 'MGESSEDIDQMFSTLLGEMDLLTQSLGVDTLPPPDPNPPRAEFNYSVGFKDLNESLNALEDQDLEALMADLVADISEAEQRTIQAQKESSQNQHHSASLQASNFSGAAPLGHGTNVAATGISQYEDDLPPPPADPVLDLPLPPPPPEPLSQEEEEAQAKADKIKLALEKLKEAKVKKLVVKVHMDDNSTKSLMVDERQLARDVLDNLFEKTHCDCNVDWCLYEIYPELQIEKESVKSVHVRYNLIRGKVSSCKVVPQNFYLDNRGKKESKETNEKMNAKNKESLLEESFCGTSIIVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGTQHKMKYKAPTDYCFVLKHPQIQKESQYIKYLCCDDARTLNQWVMGIRIAKYGKTLYDNYQRAVAKAGLASRWTNLGTVNAAAPAQPSTGPINGTAQPNGQMPQAAHSVSAVLQEAQRHAETSKVKPARPINGTAQPNGQMPQAAHSVSAVLQEAQRHAETSKRPSPAVAKRPPMPPKRHENPGTPSGAGGGEQDFMSDLMKALQKKRGNVS',\n",
       " '43346_0:004190': 'MDVQAEVNLPLHKLFFLTYLPIDGPFRGKKEMGQLSPRTRLLLDCLFLDFFLFQMGESNEDIDQMFSNLLGEMDLLTQSLGVDILPPPDPKPPRAEFNYSVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQKESPQKQSPSASLCVPSFSDTASLGYGANVAAPSQYDDDLPPPPADPMLDLPLPPPPPGPISQEEEEAQAKADKIKLALEKLKEAKVKKLVVKILMNDNSSKSLMVDERQLARDVLDNLFEKTHCDCNVDWCLYEIYPELQIERFFEDHENVVEILSDWTRDTENKLLFLEKEEKYAVFKNPQNFYLDNKGKKENKETNEKMNAKNKESLLEESFCGTSVIVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGIQCKMKYKAPTDYCFVLKHPQIQKESQYIKYLCCDDARALSQWVTGIRIAKYGKTLYDNYQRAMARAGLASRWTNLGTVNAVPPAPPSTGVKTGTTQANGQLPQATQSMNTALGEDWRQLETTKDKKPGPGLGSHDPGAPRAQPLPKSSLPPPPPPVRRSSDVGGAPPPSFAEDLPPPPPPPPALAPESVRTPPVVVKRPPPPPKRQENPGPPGGGGGEQDFMSDLMKALQKKRGNVS',\n",
       " '885580_0:00488c': 'MGESHDDIDQMFSTLLGEMDLLTQSLGVDTLPPPAPEPPRAEFNYTVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQRESCQSQNHASSLGASDCGGVTSVGYAANVTAVGISPYEDDLPPPPDDPMLDLPPPPPPPEPLSKEEEEAQAKADKIKLALEKLKEAKVKKLVVKVHMNDNSTKSLMVDERQLARDVLDNLFEKTHCDCSVDWCLYEIYPELQIERFFEDHENVVEVLSDWTRDTENKVLFLEKEEKYAVFKNPQNFYLDNKGKKEVKQTKEKMNAKTKESLLEESFCGTSVIVPELEGALYLKEDGKKAWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNVYYGVQCRVKYKAPSEHCFVLKHPQIQKESQYIKYLCCDDARTLHQWVTGIRVAKYGKTLYENYQRAVARAGLASRWTNLGTVNTAAAAQPPAGLRTGTSQPNGQLPRDAPCLSDALRESQRQADTSKVGPEGQGGHELPDRPKAAFQASTALAASPYSPKH',\n",
       " '10181_0:00305d': 'MGQSHHLFTWTIARESLLSSPLHPSLFSCPMQLALGRITRQSYQMGESNDDIDQMFSTLLGEMDLLTQSLGVDTLPPPDPDPPRPEFNYTVGFKDLNESLNALEDQDLDALMADLVADISEAEQRTIQAQKESSQSQNHAASLEASDCSGDASVGSGANVTAVNISQYEDELPPPPADPMLDLPPPPPPPEPLSKEEEEAQAKADKIRLALEKLKEAKVKKLVVKVHMNDNSTKSLMVDERQLARDVLDNLFEKTHCDCSVDWCLYEIYPELQIERFFEDHENVVEVLSDWTRDTENKVLFLEKEEKYAVFKNPQNFYLDNKGKKEGKKTNEKMNAKNKESLLEESFCGTSIIVPELEGALYLKEDGKKAWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNIYYGVQCKMKYKAPTDHCFVLKHPQIQKESQYIKYLCCDDARTLNQWVTGIRIAKYGKTLHENYQRAVARAGLASRWTNLGTVSTATAAQPPTGLRTSTTQHNGQLPQAAPHLSAVLQEAQRQAEASKVGPEGNRPKLQQISAPSPPSKPEAVFWHLLLFPASENPPYCNFT',\n",
       " '1415580_0:000900': 'MEQACDDIDQMFSDLLGEMDLLTQSLGVETIPPPSPKAPNTEFNFSVGFKDLNESLNALEDNDLDALMADLMADINETEKKTFQAQKPPSSSQRSTFTDPEPGFSIAASFDYQSNIPAAYTQDFEDYLPPLPLPPKLDLALPLPPPEPSEPLSKEELESKAKTDKIKLALEKMKEAKVKKLVIKVLMDDDSSKTLMVDERQTARDILDNLFEKTHCDCNIDWCLYEVYQELQIERWFEDHENIVDALSGWTRDSENKMLFLQKKEKYAVFKNPQNFYLAKKGKDAGKEMNEKNKESLLKESFCGTSVIVPELEGALYLKEDGKKSWKKRYFLLRASGIYYVPKGKTKTSRDLACFIQFDNVNIYYGTQYKVKFKAPTDHCFVLKHPQIQKESQYIKYLCCDDSWTLHQWVTGIRIAKFGKTLYDNYRFAVQQMGLASRWPNLSKVDPTVTARSSSSGAVQANGQIHQNVIPVISTNPEAFKRAEDKKPNVGRKPDQAQLQPVPSSNHQQSPKVALHASKIPPPAPARISSQAYSSALTLPSNVKNVNANVLLPPPPSPSPPPPDAFPLPPPCNNDLPPPPDDFYDPPPDFLPPPPPCFATGDRAQLPPGPPLPPPPPSSNQPKPFMKKPVPLPPKRQDITSLHSEQPSLAGPTPVGGGGGQPDFMSDLMKALQKKRGSTS',\n",
       " '61221_0:00105a': 'MEEACEDIDQMFSDLLGEMDLLTQSLGVETLPPPPTKASSDEFNFAVGFKDLNESLNALEDTDLDALMADLVADISEVERSTLQEPKDASRYQQVGTMQPSADAGASYGCRTDLSNIANAHVDSGLPPPSVELDFDLPPPPPSTPPAPPSELLTKEEQETQAKADKIKLALEKLKEAKVKKLVIKVHMNDNSTKSLMVDERQVARDVLDNLFEKTHCDCNIDWCLYEMCPELQIERFFEDHENVIGVLSDWTRDSENKLLFLEKSEKYAVFKNPQNFYLSNKGKNEIKVMNEKSKESLLEESFCGTSVIVPEVEGALYLKEDGKKSWKKRYFLLRASGIYYVPKGKTKTSRDLACFIQFENVNVYYGIQYKMKYKAPTDHCFVLKHPQIQRESQYIKYLCCEDQQALHHWVTGIRIAKYGKTLYDNYIRAAHKAGLASRLAKSGNTESIVAVGTSAKGSTHANGQVPQSITLSKTDSSETGKSAEMPKVKKPDNTADSIQAPTPNTPQLKHQRKAGGSHSAPPMPPQRVSSAVTAPLQLPTNAEGKGKVCPSDAAEFPPPPESMLPPPELEDLPLPPPPPPEYFESPPDFIPPPPPSCAVAVSAGAPPLPPPPPSASLPRMPLSIKKKPPPPPRRQEESAGQAGLPKPSAPPPKTETAGQGDFMSDLMKALEKKRGATS',\n",
       " '7897_0:0033c5': 'MEQACDDIDAMFSDLLGEMDMLTQSLEVESLHPAVPPALNTDFSFAVGFKDLNESLSALEDTDLDALMADLVADINKVEVETSKGHNSALQDSALPPPPSEDVGVIASSIYIPAFPGSTAVNTGYFSEPLPPPPPLPRPPPDADILLPSKPSETLTQEEIEAKAKADKIKDALEKLKEAKVKKLVIKVHMNDESSKTLMVDERQPVREILDNLFEKTHCDCCVDWCLYEINPDLQIERFFEDHENLVEILLHWTRDSENKILFVEHKEKYAVFRNPQNYYLAKKGKGAEKDMKEKMKESLLEESFCGTSVIVPELEGALYLKEDGKKSWKRRYFLLRASGIYYVPKGKTKTSRDLACFIQFDNVNVYYGMQYKVKYKAPTDHCFILKHPQIQKESQYIKYLCCDNQWTLYQWVTGIRIAKYGKTLYDNYKIAIQKAGLASRWANFAKVQSQNTTASSTGSVQANGHAGQVTPVSVSFSEAWKRGDVGKEKQSNDGQDNLPPPPPPPPPPMQGFMNEAFPPPPSLPPIASGSLPPPLRASASAPAPPPISNNFPPPLDELSPPPDDFDFPEPPPDFLPPPPTVSASGVPPPPPPPPPPPAPTAASQPTPLPKKSVPPRRQENTTLSQPRGGGGGGQPDFMSDLTKALQKKRGNAS',\n",
       " '8407_0:002bff': 'MEQTCEEIDEMFSNLLGEMDLLTQSLAVESPPPPTTTKAGTDGNVLFGFKDFDSLNTLEDNDLDALMAELVADCTDAEMKVNNQISNSVAFSSNVDSFAYNIPDFTHDLPTGSTDDLSFLPPPPPSEWEMDLPPPPPDPEEPTEKDALESRDKVDKIMLALDKMKEAKVKKLIVKIHMTDNSTKTLMVDERQTVRDILDNVFEKTHCDCTIEWCLYEENPDLQIERFFEDHENIVEILSDWTRDSENKIRFLKKNEKYAVFKNPQNFYMARKGSADMKDMNEKSKVSLLEQSFCAASVVVPDLEGAIYLKEDGKKSWKKRYFLLRASGIYYVPKGKTKTSRDLACFIQFDNVNVYYGMQYKVRYKAPTDHCFVLKHPQIQKESQYIKYLCCDEPWVLHQWVTGIRIAKYGKVLYENYKSAIHKAGLASRWSSLSSSTTPTGAPQGNGQISQNVANVSSSFSDAWKRGETAKDKQQPTEVRKPEQKISLPPSTKQPPPAPVRRPSNAHVVGTPPLPIKAKPVTSNMPPPPPPAEASQWGDDFLPPPPPPELLDTPPNFLPPPPPSFNSESDYPAPPQFTNVGSAGGPPPPPPPPPPPPAALSPKSAPPQLPVKKLPPKPPMRRDSTGQRPNQQNSLMTNGGGAGGQPDFMSDLMSALQKKRSTTT',\n",
       " '173247_0:004550': 'MEDIDAMFSDLLGEMDLLTQSLGQETVPPEALPPTNQEVNYSIGFTDLNESLHELEDNDLDALMADLVADLNATEEKLAAEIKGLKTPSPTTSDLPPPPKGLSLHPPSPHPLPASPASSTSSSVSTPASSAASSLPPPPPQNAKPTKEEIEAQMKADKIKLALEKLKEAKVKKLVVKVLMNDGSSKTLMVDERQNVREVLDNLFEKTHCDCNVDWSLCETNPELQLDRTFEDHENLVEPLSAWMRDSENQVLFQERGEKYEVFKNPQNFYLWKKDKRALKDIKDKDKEILIQENFCGTSIIVPDLEGVLHLKEDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFLQFDNVNVYYGKDFKTKYKAPTDFCFVLKHPQIQKESQYIKYLCCDDARTMNLWVTGIRIAKYGVSLYENYKTAEKKAAVNSVWMNRSTPSSSNPSTPSPTIKAKTPNQANGHAPKPQPTAPDSMDFGNFPPPPSADILPPPPPDPAFPPPPPSLPAKSSSRPVAPQHKLPANFPPPPMAMDNLPPPPLPPPIDDSPEAPPDFLPPPPPAAGFGSLPPPPLSMNSLPPPPHFGGMDQSLPPPPPDPEFLPPPPPEPVFTGAGAPPPPPPPPPPPPAQAAAVPRAPVRPSGSVRKVPPAPPKRTTPSLQVGGGGGGGDFMSELMVAMQKKRGDH',\n",
       " '30732_0:0046dd': 'MEDIDAMFSDLLGEMNLLTQSLGQEAAPAADPPTSTKEVNFSIGFSDLNASLNELEDKDLDDLMSDLMADLNATEEKLAAELQSLEAPPPPDLPPPPKGLIAPAAAAPTSPASPASVCTPSSTATSPLPAPPPQSVKPSKEDLEAQLKAEKIKLALEKLKEAKVKKLVVKVLMNDGSSKTLMVDERQTVREVLDNLFEKTHCDCNVDWSLRETNHELQLERTFEDHENLVEPLSAWTRDSENKVLFLERGEKYEVFKNPQNFYLWKKDKKALKEIKDKDKEILIKENFCGTSTIVPDLESVLHLREDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNINVYYGNDFKTKYKAPTDFCFVLKHPQIQKESQYIKYLCCDDAWTMNLWVTGIRIAKYGSVLYENFKTAEKKAVVSSAWTNRSTPSSSNPSTPSPTVKAKAQSQANGHAPKPQPGPVSQDFGHLPPPPPPCPNDDLPPPPPDPVFPPPPPPLAAKRSPKTAGRSQHPQGNFPPPPPEMDHLPPPPPMEESPPDFLPPPPPMNSLPHPPPPPASFGGVDHSLPPPPPDPEFLPPPPPDPQVTGGGGPPPPPPPPPPPPPASAPAPRGALRPTGSAKKMPPAPPKRTTPVMGGGGGGGGGGGGDFMSELMKAMQKKRSDQ',\n",
       " '241271_0:0048e4': 'MDDIDAMFSEMLGEMDLLTQSLDSSLGPETLPPEPLPSTNKEVNYSFGFTDLNASLHELEDNDLDALMADLVADLSATEEKLAAQIEDLKMPSPPPSDLPAPPVGLSTHPTSSIASPTSPASSTSSNVSTPASSSTSPLPPPPPQAAKPTMEEIEAQMKADKIKLALEKLKEAKVKKLVVKVLLNDGSTKTLMVDERQSVREVLDNLFEKTHCDCNVDWSLCETNPELNLERTFEDHENLVEPLLAWTRDSENKILFQERPGKNEVFKNPQNFYLWKKDKRALKEIKDRDKELLVQENFCGTSIIVPDLEAVLYLKEDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFIQFDNVNVYYGKDFKSKYKAPTDFCFVLKHPQIQKESQYIKYLCCDDAWTMNLWVTGIRIAKYGVSLYENFKAAEKKAANSVWTNRTPVSSNQSTPSPTIKAKSPNQANGHAAKPQPGPESQDFGNIPPPPPPPPPPMTGFLPPPPPDPVLPPPPPLLAAKSPKPSPPQRNLPTNFPPPAMDNLPPPPPPPMDDSFEDPPDFLPPPPPAAGFGSLPPPPPPVNSFPPPPPSAGFGGMGQSLPPPPPDPGFLPPPPPQPMFTGGGTIPPPPPPPPPPTAAPRAPVRPTGSVKKAPPAPPKRTTPSLHGGGGGGGGGGGDFMSELMMAMNKKRGTT',\n",
       " '8103_0:0045e4': 'MDDIDAMFSDLLGEMDLLTQSLGQETVPPASLPSTNEEVNLSIGFTDLNESLNELEDTDLDALMADLMADLNATEEKLAAQIEDLKVPSPPPSDLQPPPKGLSIRPVSSLASPTSPASSTGSNVSTSATSPLPPPPPQAAKPTKEEIEAQIKADKIKLALEKLKEAKVKKLVVKVLMNDGSAKTLMVDERQTVREVLDNMFEKTHCDCNVDWSLCETNPELQLERAFEDHENLVEPLLAWTRDSENKVLFQERGEKYEVFKNPQNFYLWKKDMRALKDIKDQDKELLIQENFCGTSIIVPDLEGVMHLKEDGKKSWKPRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNLNIYYGKDFKGKYKAPTDFCFLLKHPQIQKESQYIKYLCCDDAGSMNLWVTGIRIAKYGASLYDNYKTAEKKAAVSSVWTNRSTPSSSNPSTPSPPIKAKSPGQANGHALKPEPGPVAQDFGHVPPPPPADILPPPADILPPPPPQTFLPPPPPPLAAKSSSKPSLPQRHLPTNFPPPPPAMINLPRPPQPPPTDDASEAPPDFLPPPPPAAGFSPLFPPPPPLNALPLPPPPVSFRVEDRSLPPPPPDPGFLPPPPPMFTGAGAPPPPPPPPPPPRVAVRPAGSVKKRPPAVPKRTTPSLRGGGGGDFMSELALAMNKKRSAH',\n",
       " '56723_0:00152f': 'MDDIDAMFTDLLGEMDLLTQSLDQPTVVPEPLPSTTEMNYSIGFTDLNESLHELEDHDLDALMADLVADINATEEKLTAQMKDQKVPPPPSSDLPAPPKGLSTYSASSIASPTSPASSTGSNVSTPASSSASPLPPPPPQSAKPTMEEIEAQMKADKIKLALEKLKEAKVKKLVVKVLLTDGSSKTLMVDERQNVREVLDNLFEKTHCDCNVDWSLCETNYELNLERIFEDHENLVEPLLAWTRDTENKVLFQERTEKNDMFRNPQNFYLWKKDKKALKEIKDRDKELLVQENFCGTSVIVPDLEAVLYLKEDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNMNVYYGKDFKTRYKAPTDFCFVLKHPQIQKDSQYIKYLCCDDAWTMNLWVTGIRIAKYGASLYENFKAAEKAAVSSVWTNRSTPSSSSSSTPSPTIKAKSPSQANGHAPKPQPGPVSQDFGNVPPPPPPMANILPPPRPDAFLPPAPPPLARKNSAKPPPPQRHLPTNFPPPPPAMDNLPPPPPPPPMDDALEAPPDFLPPPPPAAGFGSLPPPPPPSNSFPPPPPPGSFGSMGQSLPPPPPDPGFLPPPPPQPVFTGAGAPPPPPPPPPPPTAAAAPRAPVRPSGSVKKIPPATPKRTTPSLQGGGGGGGGGGGGGGDFMSELMLAMNKKRST',\n",
       " '210632_0:004c0c': 'MVDIDAMFSDLLGEMDLLTQSLEQEVAPPKSLPALPSADKEVNFSIGFSDLNESLGELEDNDLDALMADLMADLNATEEKLAAEIEELKVPSLPPANLPAPKNLSIHPASSITSPPSASPAGSSSTLASSSLPPPPPQSVKPTTEEMEAQMKADKIKLALEKLKEAKVKKLVVKVMMNDGSSKTLMVDERQNVREVLDNMFEKTHCDCNVDWSLCETNPELQLERAFEDHENLVDLLSTWMRDSENKVLFQERKEKNEVFKNPQNFYLWKKDKKALKDIKDKDKGLLIQENFCGTSIIVPDLEGILHLKEDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNVNVYYSKDYKSKYKAPTDFCFVLKHPQIQKESQYIKYLCCDDAWTLNLWVTGIRIAKYGVALHENFKTAEQKAATSSAWANRSTSSSSNSSTPSPTIKAKSSSQANGIFPKPGPAPQDFGDLPPPPPLAANILPPPPPEPGLPPPPPPPPPQAAKGSAKPAPPKRQMPANFPPPPTAMDNLPPPPPPPPIDNSEAPPDFLPPPPPASGFGSFPPPPPLNSLPPPPRPGGFGGMDQSLPPPPPDPEFLPPPPPPPQAVFTGGGAPPPPPPPPPPPAAAAPSTAIPRVGLRPAGSLKKLPPAPPKRTTPSMQGSGGGGGGDFMSELMLAMQKKRGDHPPAVLASGT',\n",
       " '31033_0:00264e': 'MKMDDIDAMFSEMLGEMDLLTKSLDQEMAPPDAPPSTSEEVSFSIGFPDLNESLQELEDSDLDALMADLVADLNATEQKLAAEIEDLKVPPPPQPHLPPKSRGAVSTSSSCSPSPASSATSPLPVPPPQSVKPSMEEIEAQMKADKIKLALEKLKEAKVKKLVVKVLLNDGSSKTLMVDERQSVRDVLDNLFEKTHCDCNVDWSLCETNAELQLERTFEDHENLVEPLLAWTRDSQNKVFFQERPEKNEVFKNPQNFYLWKKDKKTLQAIKDKDKEILIKENFCGTSIIVPDLEAVLHLREDGKKSWKQRLFQLRASGLYYVPKGKTKSSRDLICFVQFDNLNVYYGKDFRSKYKAPTEFCFVLKHPQIQKESQYIKYLCCDDAWTMNLWVAGIRIAKYGTALHQNYQTALRKAAVTSAWTNCSKPSSDGPPTPPTTIKASPANGHVPKPPPGAAPQDVFPPPPPPMDILPPPPPDPAFPPPPPPLMAKRSPKPSAGHRQAPGDHLPPPPLAPPHDDASEDPPDFLPPPPPSFDSLPPPPPGMSAFPPPPPLLGFSETSQPLPPPPPDPELLLPPPPASMISTGAGAPPPPPPPPPAAAASPRPAPTASGSVRKRPPAPPKRTTPALHGSGGGAGEGAGGGDFMSELMKAMNKKRADHS',\n",
       " '63155_0:004c86': 'MDDIDAMFSAMLGEMDLLTQSLGEEKAHPEPHPSSDKQVNFSIGFTDLNESLHELEDNDLDMLMADLMADLNATEEKLAAEIHGLKEPPQPKPDPLPLPRGSSNAPVSEHILPASSGGSGSSNVSTPAPSAACSLPPPPPQCVKPTMDDIEAQAKADKIKLALEKLKEAKVKKLVVKVLMNDGSSKTLMVDERQNVREVLDNMFEKTHCDCNVNWSLCETNPELQLERAFEEHENLVESLSAWIRDSENKVLFQERPEKYEVFKNPQNFYLWKKDKKTLKDIKDKDKELLIQENFCGTSIIVPDLEGVLHLKEDGKKSWKQRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNMNVYYGKDFKTKHKAPTDFCFVLKHPQIQKDSQYIKYLCCDDAWTMNLWVTGIRIAKYGASLYENYKTAEIKGSNSMWTNRSTPSSSNQSTPSPTVKAKSPNQANGHPPKPQPGPISQAPFPPPPLAEVLPPPPPDPVLPPPPPMPAKSSAKPSPPKRQQQSNFPPPPPELDNLPPPPPPPPTDDTAEAPPDFLPPPPPAVGFGSLPPPPPSFGGVGQSLPPPPPDPQSLPPPPPDPVFIGAGAPPPPPPPPPPPAPGAPVTTLRPAVRPSGSLKKVPPAPPQRNTPSVSGGGGGGGGDFMSELMLAMQKKRGAQ',\n",
       " '7994_0:004d71': 'MDDIDAMFTDMLEEMDLLTQSLGAEATEPTPPSKSSSSSSFNSMPEMSNFSIGFTDLNASLNELEDNDLDSLMADLVADLNATEELFAAEKGGVKEPRPPPAVTVPAVHFGSAAPIAPAAPTPSKPKNDVTSCPPAGNTQSLPPPPPASTRPSTDDPEAQKAEKIKLALEKLKEAKVKKLIVKVEITDGSSKTLMVDERQTVRDVMDNLFEKTHCDGNVDWCLCETNPELQTERGFEDHENLVEPLSAWTRDSENKVLFHERKDKYEVFKNPQNFYMWKKDKKSLMDMKDKDKELLLEENFCGTSVIVPDLEGMMYLKEEGKKSWKQRYFLLRASGLYYLPKGKTKSSKDMVCLVQFDNMNVYYCSEYKTKYKAPTDYCFILKHPQIQKESQYIKYLCCDDKWTMTLWVTGIRIAKYGKTMYENYKTAARKGSSLSAVWTSMNRQPSPSTSNTSTPSPTPKAKTANGHASQPRSETVPKAPSNQSAFPPPPPPADFLPPPPPDPTLPPPPPPPPALPVKKESNPPRSAPQRSQPAFPPPPPAMDFSLPPPPPPSDDLEMPPDFLPPPPPAPGGFMGGDLLPPPPPEPFHAPLPPPPAAFHPPPAVHPPPQATGGDLPPPPPPPPPPPPAPAAFHQTPSVRKVGPPPPKRTTPSLAAPSGGDFMSELMLAMNKKRGGQ',\n",
       " '109280_0:00369f': 'MDDIDAMFSDLLGEMDLLTQSLGQEQAPPPSSPPEAEQEVNLSIGFTDLNASLNELEDNDLDALMADLVADLNATEEKLAAEIESLKEPQPEPLPPPSVGPPSSSPPLSSDSSTTFPSSTLPPPPPQSSKPTMEEIEAQIKADKIKLALEKLKEAKVKKLVVKVCMNDGSSKTLMVDERQNVREVLDNLCEKTHCDYNVDWSLCETNPELQLERTFEDHEHLVEPLLAWTRDSENQILFQESSDKYEVFKNPQKFYLWKKDKKVLKDMKDKDKEILIKENFCGTSIMVPDLEGVLHLKEDGKKSWKPRLFQLRASGIYYVPKGKTKSSRDLVCFVQFDNVNVYYGKDFRAKHKAPSDFCFVLKHPQIQKDSQYIKYLCCDDAWTMNLWVTGIRIAKYGSNLYENFKTAEKKAAVGSAWASCSVTSGQKQSQSQVANGHANNTSPSPLPPPPPPLGEDLPPPPPPPPQLGKTLPPAPPPLGATLPTPPPPPGGTPPPPPPPRRNPPPYPRHLPHISELYPLRRLLLLYQLPTVHSLVLLFQPNLPPNPSPNHDVQRPISRCLPGPQITFPPPPPPPVDDSPPDFLPPPPPAANFGSHPPPPPPVKTLPPPPPHMKTLPPARLSFKSTNLPPPPPDPGFLPPPLTGVPPPPPPPPPPPPTTAAAGPRRAPVRPSGSLKKMPPPPPKRSTPSLHGRRDGDRGDGDGGGGGDFMSELMRAMQKKRDPH',\n",
       " '150288_0:004e5a': 'MDDIDVMFSHLLEEMDDLTQSLVQSADTAADAQTNSSGASDLNEPLNNLDKSESDHLLAQPEETLPVDNQTAPSDPPLPSASSVTLASPTTLAMLKLEPMEVQNESPAPKLTMPQTANNEKPPQTIIKVWMSDGSTKTLMVEGTQTVRDVLDKLFEKTYCDCATEWSLCEINQELHVERILEDHECFVESLSMWSSVTDNKLYFLKRPQKYVIFTQPQFFYMWKRSSLKAISEQEQQLLLKENFGGLTAVVPDLEGWLYLKDDGRKVWKPRYFVLRASGLYYVPKGKTKSSSDLACFVRFEQVNVYSADGHRIRYRAPTDYCFVLKHPCIQKESQYVKFLCCENEDTVLLWVNSIRIAKYGTVLYENYKTALKRAQHPPDRCSTSSDNLNSQIGQSAPTPDECIEQDEPPPDFIPPPPPGYMAIL'}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ex1.full_length_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'9606_0:00294e': [440, 665],\n",
       " '9793_0:005123': [440, 657],\n",
       " '1706337_0:000fc7': [457, 676],\n",
       " '51337_0:001b5a': [440, 632],\n",
       " '9568_0:004ae1': [426, 564],\n",
       " '43346_0:004190': [492, 656],\n",
       " '885580_0:00488c': [440, 524],\n",
       " '10181_0:00305d': [484, 578],\n",
       " '1415580_0:000900': [439, 679],\n",
       " '61221_0:00105a': [440, 678],\n",
       " '7897_0:0033c5': [442, 653],\n",
       " '8407_0:002bff': [430, 663],\n",
       " '173247_0:004550': [432, 680],\n",
       " '30732_0:0046dd': [425, 663],\n",
       " '241271_0:0048e4': [435, 685],\n",
       " '8103_0:0045e4': [429, 673],\n",
       " '56723_0:00152f': [430, 685],\n",
       " '210632_0:004c0c': [429, 685],\n",
       " '31033_0:00264e': [420, 658],\n",
       " '63155_0:004c86': [431, 667],\n",
       " '7994_0:004d71': [439, 676],\n",
       " '109280_0:00369f': [418, 723],\n",
       " '150288_0:004e5a': [376, 424]}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ex1.idr_position_map"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``mod`` input is required so that you can preload the ESM model before running the method. You preload the ESM model with ``pairk.ESM_Model()``"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mInit signature:\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mESM_Model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'esm2_t33_650M_UR50D'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthreads\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m     \n",
      "This was adapted from the kibby conservation method: DOI: 10.1093/bib/bbac599.\n",
      "see https://github.com/esbgkannan/kibby\n",
      "\n",
      "Class that loads a specified ESM model. Provides a method for encoding protein sequences.\n",
      "\n",
      "available models:\n",
      "- esm1b_t33_650M_UR50S\n",
      "\n",
      "- esm2_t6_8M_UR50D\n",
      "\n",
      "- esm2_t12_35M_UR50D\n",
      "\n",
      "- esm2_t30_150M_UR50D\n",
      "\n",
      "- esm2_t33_650M_UR50D (default)\n",
      "\n",
      "- esm2_t36_3B_UR50D\n",
      "\n",
      "\n",
      "\n",
      "Attributes\n",
      "----------\n",
      "model_name : str\n",
      "    the name of the model that was loaded.\n",
      "threads : int\n",
      "    the number of threads for pytorch to use, by default 1.\n",
      "\u001b[0;31mFile:\u001b[0m           ~/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/tools/esm_tools.py\n",
      "\u001b[0;31mType:\u001b[0m           type\n",
      "\u001b[0;31mSubclasses:\u001b[0m     "
     ]
    }
   ],
   "source": [
    "pairk.ESM_Model?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "you can use pre-generated embeddings by providing them in a dictionary format to the `precomputed_embeddings` argument. The keys should be the sequence ids and the values should be full length sequence embedding tensors. For each sequence, the tensor.shape[0] should be equal to l+2, where l is the length of the full length sequence. The +2 is for the start and end tokens. If you provide precomputed embeddings, the `mod` and `device` arguments are ignored."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``pairk.pairk_alignment_embedding_distance`` method returns a ``PairkAln`` object, just like the previous methods"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: loading the ESM2 model and running the method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "mod = pairk.ESM_Model(threads=4)\n",
    "aln_results_embedding = pairk.pairk_alignment_embedding_distance(\n",
    "    full_length_sequence_dict=ex1.full_length_dict,\n",
    "    idr_position_map=ex1.idr_position_map,\n",
    "    query_id=ex1.query_id,\n",
    "    k=5,\n",
    "    mod=mod,\n",
    "    device=\"cpu\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## k-mer alignment results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The results of the above pairwise k-mer alignment methods are returned as a ``PairkAln`` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mInit signature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkAln\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0morthokmer_df\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mpos_df\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mscore_df\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m     \n",
      "A class to store the results of the pairwise alignment.\n",
      "\n",
      "The primary data is stored in pandas dataframes. All dataframes have the\n",
      "same structure. One column is the query k-mer sequence\n",
      "('query_kmer'). The other columns are named as the ortholog sequence\n",
      "ids. The dataframe indexes are the query k-mer start position in the\n",
      "query sequence.\n",
      "\n",
      "Attributes\n",
      "----------\n",
      "orthokmer_matrix : pd.DataFrame\n",
      "    the best scoring k-mer from each ortholog for each query k-mer.\n",
      "position_matrix : pd.DataFrame\n",
      "    the start position of the best scoring k-mer from each ortholog for\n",
      "    each query k-mer.\n",
      "score_matrix : pd.DataFrame | None\n",
      "    the alignment scores for each k-mer in the query sequence against\n",
      "    the corresponding best matching ortholog k-mer.\n",
      "query_kmers : list[str]\n",
      "    the list of query k-mers that were aligned.\n",
      "query_sequence : str\n",
      "    the full query sequence that was originally split into k-mers and aligned.\n",
      "k : int\n",
      "    the k-mer size used for the alignment.\n",
      "\u001b[0;31mFile:\u001b[0m           ~/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/tools/pairwise_tools.py\n",
      "\u001b[0;31mType:\u001b[0m           type\n",
      "\u001b[0;31mSubclasses:\u001b[0m     "
     ]
    }
   ],
   "source": [
    "pairk.PairkAln?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The actual \"alignments\" are stored as matrices in the ``PairkAln`` object. The main matrices are:\n",
    "\n",
    "* orthokmer_matrix - the best matching k-mers from each homolog for each query k-mer\n",
    "* position_matrix - the positions of the best matching k-mers in the homologs\n",
    "* score_matrix - the scores of the best matching k-mers\n",
    "\n",
    "Each matrix is a pandas DataFrame where the index is the start position of the k-mer in the query sequence. The columns are the query k-mers + the homolog sequence ids."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``PairkAln`` object has some useful methods for accessing the data. For example, you can get the best matching k-mers for a query k-mer by its position in the query sequence using the ``.get_pseudo_alignment`` method (or by directly accessing the dataframes). You can also plot the matrices as heatmaps, save the results to a json file, and load the results from that file\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: accessing the DataFrames from the ``PairkAln`` object directly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>query_kmer</th>\n",
       "      <th>9793_0:005123</th>\n",
       "      <th>1706337_0:000fc7</th>\n",
       "      <th>51337_0:001b5a</th>\n",
       "      <th>9568_0:004ae1</th>\n",
       "      <th>43346_0:004190</th>\n",
       "      <th>885580_0:00488c</th>\n",
       "      <th>10181_0:00305d</th>\n",
       "      <th>1415580_0:000900</th>\n",
       "      <th>61221_0:00105a</th>\n",
       "      <th>...</th>\n",
       "      <th>30732_0:0046dd</th>\n",
       "      <th>241271_0:0048e4</th>\n",
       "      <th>8103_0:0045e4</th>\n",
       "      <th>56723_0:00152f</th>\n",
       "      <th>210632_0:004c0c</th>\n",
       "      <th>31033_0:00264e</th>\n",
       "      <th>63155_0:004c86</th>\n",
       "      <th>7994_0:004d71</th>\n",
       "      <th>109280_0:00369f</th>\n",
       "      <th>150288_0:004e5a</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>TNLGT</td>\n",
       "      <td>22.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>...</td>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NLGTV</td>\n",
       "      <td>16.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>LGTVN</td>\n",
       "      <td>16.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>GTVNA</td>\n",
       "      <td>19.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TVNAA</td>\n",
       "      <td>18.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>217</th>\n",
       "      <td>LQKKR</td>\n",
       "      <td>31.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>31.0</td>\n",
       "      <td>24.0</td>\n",
       "      <td>...</td>\n",
       "      <td>26.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>218</th>\n",
       "      <td>QKKRG</td>\n",
       "      <td>29.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>...</td>\n",
       "      <td>23.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>219</th>\n",
       "      <td>KKRGN</td>\n",
       "      <td>29.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>18.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>...</td>\n",
       "      <td>17.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>18.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>220</th>\n",
       "      <td>KRGNV</td>\n",
       "      <td>29.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>...</td>\n",
       "      <td>9.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>221</th>\n",
       "      <td>RGNVS</td>\n",
       "      <td>23.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>...</td>\n",
       "      <td>10.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>222 rows × 23 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    query_kmer 9793_0:005123 1706337_0:000fc7 51337_0:001b5a 9568_0:004ae1  \\\n",
       "0        TNLGT          22.0             28.0           28.0          28.0   \n",
       "1        NLGTV          16.0             29.0           29.0          29.0   \n",
       "2        LGTVN          16.0             29.0           29.0          29.0   \n",
       "3        GTVNA          19.0             26.0           23.0          26.0   \n",
       "4        TVNAA          18.0             25.0           22.0          25.0   \n",
       "..         ...           ...              ...            ...           ...   \n",
       "217      LQKKR          31.0             31.0           19.0          31.0   \n",
       "218      QKKRG          29.0             23.0           16.0          29.0   \n",
       "219      KKRGN          29.0             23.0           18.0          29.0   \n",
       "220      KRGNV          29.0             19.0           20.0          29.0   \n",
       "221      RGNVS          23.0             12.0           13.0          27.0   \n",
       "\n",
       "    43346_0:004190 885580_0:00488c 10181_0:00305d 1415580_0:000900  \\\n",
       "0             28.0            28.0           28.0             10.0   \n",
       "1             29.0            29.0           29.0             16.0   \n",
       "2             29.0            29.0           23.0             10.0   \n",
       "3             26.0            23.0           17.0             15.0   \n",
       "4             22.0            22.0           16.0             14.0   \n",
       "..             ...             ...            ...              ...   \n",
       "217           31.0             3.0            9.0             31.0   \n",
       "218           29.0             5.0            3.0             29.0   \n",
       "219           29.0             2.0            2.0             23.0   \n",
       "220           29.0             8.0            8.0             17.0   \n",
       "221           27.0             9.0           13.0             15.0   \n",
       "\n",
       "    61221_0:00105a  ... 30732_0:0046dd 241271_0:0048e4 8103_0:0045e4  \\\n",
       "0              9.0  ...           13.0            12.0          13.0   \n",
       "1              8.0  ...           11.0            13.0          11.0   \n",
       "2              7.0  ...           11.0             8.0           9.0   \n",
       "3             10.0  ...           11.0             9.0          10.0   \n",
       "4             11.0  ...           11.0             9.0           8.0   \n",
       "..             ...  ...            ...             ...           ...   \n",
       "217           24.0  ...           26.0            19.0          19.0   \n",
       "218           22.0  ...           23.0            22.0          16.0   \n",
       "219           21.0  ...           17.0            23.0          15.0   \n",
       "220           15.0  ...            9.0            17.0           8.0   \n",
       "221           13.0  ...           10.0            11.0           8.0   \n",
       "\n",
       "    56723_0:00152f 210632_0:004c0c 31033_0:00264e 63155_0:004c86  \\\n",
       "0             13.0             9.0            8.0           13.0   \n",
       "1             13.0             7.0            7.0           11.0   \n",
       "2             10.0             7.0            8.0           10.0   \n",
       "3              8.0             8.0            9.0           11.0   \n",
       "4             12.0             8.0           11.0           11.0   \n",
       "..             ...             ...            ...            ...   \n",
       "217           19.0            26.0           19.0           26.0   \n",
       "218           16.0            29.0           17.0           29.0   \n",
       "219           17.0            23.0           18.0           21.0   \n",
       "220           11.0            14.0            9.0           13.0   \n",
       "221           13.0             7.0            9.0            7.0   \n",
       "\n",
       "    7994_0:004d71 109280_0:00369f 150288_0:004e5a  \n",
       "0             8.0            14.0             9.0  \n",
       "1             6.0            14.0            10.0  \n",
       "2             8.0            16.0             4.0  \n",
       "3             9.0             9.0             6.0  \n",
       "4            10.0            11.0             5.0  \n",
       "..            ...             ...             ...  \n",
       "217          19.0            26.0             0.0  \n",
       "218          22.0            23.0            -1.0  \n",
       "219          22.0            14.0            -1.0  \n",
       "220          14.0            11.0             2.0  \n",
       "221           9.0             8.0             9.0  \n",
       "\n",
       "[222 rows x 23 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.score_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: access the best matching k-mers for the query k-mer at position 4:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "query_kmer          TVNAA\n",
       "9793_0:005123       TGNAA\n",
       "1706337_0:000fc7    TVNAA\n",
       "51337_0:001b5a      TVNTA\n",
       "9568_0:004ae1       TVNAA\n",
       "43346_0:004190      TVNAV\n",
       "885580_0:00488c     TVNTA\n",
       "10181_0:00305d      TVSTA\n",
       "1415580_0:000900    NVNAN\n",
       "61221_0:00105a      AVSAG\n",
       "7897_0:0033c5       TVSAS\n",
       "8407_0:002bff       SQNVA\n",
       "173247_0:004550     TPNQA\n",
       "30732_0:0046dd      TVKAK\n",
       "241271_0:0048e4     PVNSF\n",
       "8103_0:0045e4       PLNAL\n",
       "56723_0:00152f      TAAAA\n",
       "210632_0:004c0c     TIKAK\n",
       "31033_0:00264e      TIKAS\n",
       "63155_0:004c86      TVKAK\n",
       "7994_0:004d71       TSNTS\n",
       "109280_0:00369f     TTAAA\n",
       "150288_0:004e5a     NLNSQ\n",
       "Name: 4, dtype: object"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.orthokmer_matrix.loc[4]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: access the best matching k-mers for the query k-mer at position 4 using the ``get_pseudo_alignment`` method.\n",
    "(the returned list includes the query k-mer sequence)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['TVNAA',\n",
       " 'TGNAA',\n",
       " 'TVNAA',\n",
       " 'TVNTA',\n",
       " 'TVNAA',\n",
       " 'TVNAV',\n",
       " 'TVNTA',\n",
       " 'TVSTA',\n",
       " 'NVNAN',\n",
       " 'AVSAG',\n",
       " 'TVSAS',\n",
       " 'SQNVA',\n",
       " 'TPNQA',\n",
       " 'TVKAK',\n",
       " 'PVNSF',\n",
       " 'PLNAL',\n",
       " 'TAAAA',\n",
       " 'TIKAK',\n",
       " 'TIKAS',\n",
       " 'TVKAK',\n",
       " 'TSNTS',\n",
       " 'TTAAA',\n",
       " 'NLNSQ']"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.get_pseudo_alignment(4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "you can search for a specific kmer to get its positions. You can then use the positions to query the matrices."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[75, 113, 127, 157]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.find_query_kmer_positions('LPPPP')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'PPMPP',\n",
       " 'LPPPP',\n",
       " 'LPDRP',\n",
       " 'APSPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'LPPPP',\n",
       " 'IPPPP']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.get_pseudo_alignment(75)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>75</th>\n",
       "      <th>113</th>\n",
       "      <th>127</th>\n",
       "      <th>157</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>query_kmer</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9793_0:005123</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1706337_0:000fc7</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51337_0:001b5a</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9568_0:004ae1</th>\n",
       "      <td>PPMPP</td>\n",
       "      <td>PPMPP</td>\n",
       "      <td>PPMPP</td>\n",
       "      <td>PPMPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43346_0:004190</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>885580_0:00488c</th>\n",
       "      <td>LPDRP</td>\n",
       "      <td>LPDRP</td>\n",
       "      <td>LPDRP</td>\n",
       "      <td>LPDRP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10181_0:00305d</th>\n",
       "      <td>APSPP</td>\n",
       "      <td>APSPP</td>\n",
       "      <td>APSPP</td>\n",
       "      <td>APSPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1415580_0:000900</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61221_0:00105a</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7897_0:0033c5</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8407_0:002bff</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>173247_0:004550</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30732_0:0046dd</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>241271_0:0048e4</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8103_0:0045e4</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56723_0:00152f</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>210632_0:004c0c</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31033_0:00264e</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>63155_0:004c86</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7994_0:004d71</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109280_0:00369f</th>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "      <td>LPPPP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>150288_0:004e5a</th>\n",
       "      <td>IPPPP</td>\n",
       "      <td>IPPPP</td>\n",
       "      <td>IPPPP</td>\n",
       "      <td>IPPPP</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    75     113    127    157\n",
       "query_kmer        LPPPP  LPPPP  LPPPP  LPPPP\n",
       "9793_0:005123     LPPPP  LPPPP  LPPPP  LPPPP\n",
       "1706337_0:000fc7  LPPPP  LPPPP  LPPPP  LPPPP\n",
       "51337_0:001b5a    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "9568_0:004ae1     PPMPP  PPMPP  PPMPP  PPMPP\n",
       "43346_0:004190    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "885580_0:00488c   LPDRP  LPDRP  LPDRP  LPDRP\n",
       "10181_0:00305d    APSPP  APSPP  APSPP  APSPP\n",
       "1415580_0:000900  LPPPP  LPPPP  LPPPP  LPPPP\n",
       "61221_0:00105a    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "7897_0:0033c5     LPPPP  LPPPP  LPPPP  LPPPP\n",
       "8407_0:002bff     LPPPP  LPPPP  LPPPP  LPPPP\n",
       "173247_0:004550   LPPPP  LPPPP  LPPPP  LPPPP\n",
       "30732_0:0046dd    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "241271_0:0048e4   LPPPP  LPPPP  LPPPP  LPPPP\n",
       "8103_0:0045e4     LPPPP  LPPPP  LPPPP  LPPPP\n",
       "56723_0:00152f    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "210632_0:004c0c   LPPPP  LPPPP  LPPPP  LPPPP\n",
       "31033_0:00264e    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "63155_0:004c86    LPPPP  LPPPP  LPPPP  LPPPP\n",
       "7994_0:004d71     LPPPP  LPPPP  LPPPP  LPPPP\n",
       "109280_0:00369f   LPPPP  LPPPP  LPPPP  LPPPP\n",
       "150288_0:004e5a   IPPPP  IPPPP  IPPPP  IPPPP"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aln_results.orthokmer_matrix.loc[[75, 113, 127, 157]].T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note - the k-mers are defined by position rather than sequence. You could easily make a variant of this method that uses the unique sequences instead. It would make the method slightly faster. <br>The reason that I didn't do this is because I wanted to mimic the LLM embedding version of Pairk, where identical k-mers have different embeddings and thus are treated as different k-mers.<br>Inclusion of duplicate k-mers does alter the final z-scores, so it's something to be aware of."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: plot a heatmap of the matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots(figsize=(3,3))\n",
    "aln_results.plot_position_heatmap(ax)\n",
    "ax.xaxis.set_visible(False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: save the results to a file using ``write_to_file`` and load them back into python using ``from_file``:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PairkAln object for 222 query k-mers\n",
      "query sequence: TNLGTVNAAAPAQPSTGPKTGTTQPNGQIPQATHSVSAVLQEAQRHAETSKDKKPALGNHHDPAVPRAPHAPKSSLPPPPPVRRSSDTSGSPATPLKAKGTGGGGLPAPPDDFLPPPPPPPPLDDPELPPPPPDFMEPPPDFVPPPPPSYAGIAGSELPPPPPPPPAPAPAPVPDSARPPPAVAKRPPVPPKRQENPGHPGGAGGGEQDFMSDLMKALQKKRGNVS\n",
      "k-mer length: 5\n",
      "\n"
     ]
    }
   ],
   "source": [
    "aln_results.write_to_file('./aln_results.json')\n",
    "aln_results = pairk.PairkAln.from_file('./aln_results.json')\n",
    "print(aln_results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step 2: k-mer conservation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this step, the query k-mer and the best matching homolog k-mers are treated as a gapless multiple sequence alignment with 'k' columns, which we call a \"pseudo-MSA\". Column-wise conservation scores are calculated for each position in each pseudo-MSA. All of the conservation scores are then converted to z-scores to give the relative conservation of each k-mer position compared to the rest of the query IDR. The conservation score results are stored in a ``PairkConservation`` object which also provides methods for plotting the results and reading/writing the results from/to files.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## pairk.calculate_conservation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "the main method for Step 2 is the ``pairk.calculate_conservation`` method. It simply takes the ``PairkAln`` object as input, along with a columnwise conservation scoring function and returns a ``PairkConservation`` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mSignature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalculate_conservation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mpairk_aln_results\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairwise_tools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkAln\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mscore_func\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mCallable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m<\u001b[0m\u001b[0mfunction\u001b[0m \u001b[0mproperty_entropy\u001b[0m \u001b[0mat\u001b[0m \u001b[0;36m0x1628bec00\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconservation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkmer_conservation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkConservation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m\n",
      "calculate the conservation scores for the k-mers in the PairkAln object. calculates the conservation scores and z-scores for each k-mer position.\n",
      "\n",
      "Parameters\n",
      "----------\n",
      "pairk_aln_results : PairkAln\n",
      "    the results of the pairk alignment step as a pairk.PairkAln object.\n",
      "score_func : Callable, optional\n",
      "    A function to calculate conservation scores in a columnwise manner, by\n",
      "    default it is the property_entropy function from Capra and Singh 2007,\n",
      "    DOI: 10.1093/bioinformatics/btm270 located in the\n",
      "    `pairk.pairk_conservation.capra_singh_functions` module.\n",
      "\n",
      "Returns\n",
      "-------\n",
      "PairkConservation\n",
      "    PairkConservation object containing the conservation scores and z-scores for each k-mer position.\n",
      "\u001b[0;31mFile:\u001b[0m      ~/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/conservation/kmer_conservation.py\n",
      "\u001b[0;31mType:\u001b[0m      function"
     ]
    }
   ],
   "source": [
    "pairk.calculate_conservation?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The columnwise conservation scoring function can be any function that takes a string of residues (a column of an alignment) as an input and returns a float (conservation score). You can use custom functions here, but pairk comes with a few built-in functions from Capra and Singh 2007 (DOI: 10.1093/bioinformatics/btm270) available in the ``pairk.capra_singh_functions`` module. The ``pairk.capra_singh_functions.property_entropy`` is the default function used by ``pairk.calculate_conservation``.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mType:\u001b[0m        module\n",
      "\u001b[0;31mString form:\u001b[0m <module 'pairk.backend.conservation.capra_singh_functions' from '/Users/jackson/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/conservation/capra_singh_functions/__init__.py'>\n",
      "\u001b[0;31mFile:\u001b[0m        ~/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/conservation/capra_singh_functions/__init__.py\n",
      "\u001b[0;31mDocstring:\u001b[0m  \n",
      "Module to hold conservation methods from Capra and Singh 2007, DOI: 10.1093/bioinformatics/btm270\n",
      "\n",
      "The methods in this module are used to calculate column-wise conservation scores and take a string of characters (an alignment column) as input.\n",
      "Conservation scores are calculated and normalized to a range of 0 to 1, where 0 is the least conserved and 1 is the most conserved.\n",
      "By default, gaps are penalized by multiplying the final conservation score by the fraction of non-gap characters in the column.\n",
      "\n",
      "Methods:\n",
      "--------\n",
      "property_entropy : Callable\n",
      "    Calculate the property entropy of a column of sequence characters\n",
      "shannon_entropy : Callable\n",
      "    Calculate the Shannon entropy of a column of sequence characters"
     ]
    }
   ],
   "source": [
    "pairk.capra_singh_functions?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "aln_results = pairk.pairk_alignment(\n",
    "    idr_dict=ex1.idr_dict,\n",
    "    query_id=ex1.query_id,\n",
    "    k=5,\n",
    "    matrix_name=\"EDSSMat50\"\n",
    ")\n",
    "conservation_results = pairk.calculate_conservation(\n",
    "    aln_results,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: using a different conservation scoring function:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8161170118989496\n"
     ]
    }
   ],
   "source": [
    "from pairk import capra_singh_functions\n",
    "column = 'NNNNNNNNNKNSNNNNNNNNSSN'\n",
    "print(capra_singh_functions.shannon_entropy(column))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "aln_results = pairk.pairk_alignment(\n",
    "    idr_dict=ex1.idr_dict,\n",
    "    query_id=ex1.query_id,\n",
    "    k=5,\n",
    ")\n",
    "conservation_results = pairk.calculate_conservation(\n",
    "    pairk_aln_results=aln_results,\n",
    "    score_func=capra_singh_functions.shannon_entropy\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## k-mer conservation results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``pairk.calculate_conservation`` method returns a ``PairkConservation`` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0;31mInit signature:\u001b[0m\n",
      "\u001b[0mpairk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPairkConservation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0morthokmer_arr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mscore_arr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m    \u001b[0mz_score_arr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
      "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDocstring:\u001b[0m     \n",
      "a class to store the results of the conservation scoring\n",
      "\n",
      "The methods can be used to create plots of the conservation scores and\n",
      "sequence logos.\n",
      "\n",
      "Attributes\n",
      "----------\n",
      "orthokmer_arr : np.ndarray\n",
      "    the best scoring k-mer from each ortholog for each query k-mer.\n",
      "score_arr : np.ndarray\n",
      "    the conservation scores for each k-mer position.\n",
      "z_score_arr : np.ndarray\n",
      "    the z-scores for each k-mer position.\n",
      "query_kmers : list[str]\n",
      "    the query k-mers.\n",
      "query_sequence : str\n",
      "    the query sequence.\n",
      "k : int\n",
      "    the length of the query k-mers.\n",
      "bg_scores : np.ndarray\n",
      "    the background conservation scores used to calculate the z-scores. This\n",
      "    is just a flattened version of the score_arr.\n",
      "n_bg_scores : int\n",
      "    the number of background scores used to calculate the z-scores.\n",
      "n_bg_kmers : int\n",
      "    the number of k-mers used to calculate the z-scores.\n",
      "bg_mean : float\n",
      "    the mean of the background scores.\n",
      "bg_std : float\n",
      "    the standard deviation of the background scores.\n",
      "\u001b[0;31mFile:\u001b[0m           ~/Dropbox (MIT)/work/07-SLiM_bioinformatics/11-pairk/pairk/backend/conservation/kmer_conservation.py\n",
      "\u001b[0;31mType:\u001b[0m           type\n",
      "\u001b[0;31mSubclasses:\u001b[0m     "
     ]
    }
   ],
   "source": [
    "pairk.PairkConservation?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The returned ``PairkConservation`` object has matrices with similar structure as ``PairkAln`` object matrices, except that they are numpy arrays instead of pandas dataframes.\n",
    "\n",
    "* orthokmer_arr - the best matching k-mers from each homolog for each query k-mer - analogous to the orthokmer_matrix in the ``PairkAln`` object\n",
    "* score_arr - the conservation scores for each position in the pseudo-MSA of each query k-mer\n",
    "* z_score_arr - the conservation score z-scores for each position in the pseudo-MSA of each query k-mer\n",
    "\n",
    "If ``n`` is the number of k-mers in the query sequence and ``m`` is the number of homologs (including the query sequence), the matrices will have the dimensions:\n",
    "\n",
    "* orthokmer_arr: (n, m)\n",
    "* score_arr: (n, k)\n",
    "* z_score_arr: (n, k)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### accessing the results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The row index of the arrays correspond to the starting position of the query k-mer in the query IDR. \n",
    "\n",
    "For example, to access the conservation scores for the k-mer at position 4 in the query IDR, you would access the 4th row of the arrays: ``.score_arr[4, :]``."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "query k-mer at position 4: TVNAA\n",
      "pseudo-MSA for the query k-mer at position 4 (including the query k-mer): ['TVNAA' 'TGNAA' 'TVNAA' 'TVNTA' 'TVNAA' 'TVNAV' 'TVNTA' 'TVSTA' 'NVNAN'\n",
      " 'AVSAG' 'TVSAS' 'SQNVA' 'TPNQA' 'TVKAK' 'PVNSF' 'PLNAL' 'TAAAA' 'TIKAK'\n",
      " 'TIKAS' 'TVKAK' 'TSNTS' 'TTAAA' 'NLNSQ']\n",
      "scores for each position of the k-mer at position 4:\n",
      "[0.69754401 0.48589838 0.6438038  0.64920359 0.44093655]\n",
      "z scores for each position of the k-mer at position 4:\n",
      "[ 0.17610372 -1.01357184 -0.12597394 -0.09562132 -1.26630561]\n"
     ]
    }
   ],
   "source": [
    "k_mer_position = 4\n",
    "print(f\"query k-mer at position {k_mer_position}: {conservation_results.orthokmer_arr[k_mer_position, 0]}\")\n",
    "print(f\"pseudo-MSA for the query k-mer at position {k_mer_position} (including the query k-mer): {conservation_results.orthokmer_arr[k_mer_position, :]}\")\n",
    "print(f\"scores for each position of the k-mer at position {k_mer_position}:\")\n",
    "print(conservation_results.score_arr[k_mer_position, :])\n",
    "print(f\"z scores for each position of the k-mer at position {k_mer_position}:\")\n",
    "print(conservation_results.z_score_arr[k_mer_position, :])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### plotting the results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are several plotting functions available from the ``pairk.PairkConservation`` object shown below."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: plotting background score distributions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='Conservation score', ylabel='Count'>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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d911lzSenIeHh4iLi6vPVa+T+txuf/75p9TOy8ur2lcafPvtt1LbsrIyMXbsWKm9frt5e3tLB5LavIqiITTEvvbKK69I7Zs1aybuvPNO4e/vL02bPHmydBCtyFb3tYqWLFkiAIguXbqYFYc17WumVJecrOW4ZhPJSYjy98UsWLBAhIaGmj36eHU7/sWLF8WkSZNEq1athEqlEt7e3mLUqFHVvrvk1KlT4uGHHxa+vr7C3t5etGzZUkyYMEEkJSXVYQ0bRn1tt7ffflv6gzfnx9glgK1bt4p//etfonnz5kKlUomWLVuKMWPGiMOHDzfAmtdeQ+xr+/btE9HR0aJFixbC3t5etGjRQgwbNkx8/fXXVcZii/taRdOmTRMAxP3331+jWKxlXzOmLslJCPkc1xRCVBhtk4iISAaafG89IiKyPkxOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOREQkO0xOZCA3NxcrV67Ev/71L9xxxx1QqVRo1qwZunfvjunTpyMxMdHSIdq8goICXLx40WDaZ599BoVCgVatWlkmKKJ6xuREkq+//hrt2rXD888/j3379qG0tBRdu3aFl5cXzpw5gxUrVqBLly6IiYmxdKg2a/PmzejQoQN++uknS4dC1KCYnAgA8M4772D48OHQaDQYM2YM4uLikJWVhePHj+PixYu4dOkSnnnmGZSWlmLu3LmYN2+epUO2SbNnz0ZGRkal6Q899BDi4+Nx8OBBC0RFVP+YnAiHDx/GzJkzAQDz5s3Dl19+ic6dOxvUadmyJVatWiUlpSVLluCvv/5q9FjJOHd3d3Ts2BHt2rWzdChE9YLJycYJIfDUU09Bq9UiIiICr7/+epX1586di4CAAOh0Orz77ruNFCUR2RomJxv322+/IT4+HgAwa9asaus7ODhg3bp12LdvH9asWVOpPDs7G4sWLUJYWBjUajVcXFwQGhqKV155BVeuXKlUX38jf+zYscjPz8e8efMQEhICJycneHl5Yfjw4Th06JDRWBISEjBx4kR07twZrq6ucHd3R1hYGObMmYNr164ZbaPVarFhwwYMHDgQzZs3h6OjI9q2bYunn34a58+fr1T/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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "conservation_results.plot_background_distribution()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: plotting conservation scores\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'conservation z-scores')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x150 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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0LDmyMnOcnUpNyUfXz1OnjjOQEVERISbNEylpqYiJzsLTbq9BN8awa4u56aSnX4eSds+QmpqKsMUERERbtIwZeJbIxh+gY1dXQYRERHdxPgFdCIiIiINnB6msrKyEBUVhbCwMHh7eyMgIAA9e/ZEbGyss0shIiIi0sypYSozMxP3338/3nzzTZw+fRotWrSAwWDAli1b0KdPH7z55pvOLIeIiIhIM6eGqdGjR2P//v1o3bo1fvvtNxw+fBhnz57F4sWL4eHhgaioKGzbts2ZJRERERFp4rQw9dtvv2Hp0qVwc3PDsmXLEBz8z6/shg4divHjxwMAoqKinFUSERERkWZOC1NLlizBjRs30K5dO4SHhxdZHhkZCQCIi4vDuXPnnFUWERERkSZOC1N79+4FAHTs2NHq8rp166J+/foAgF27djmrLCIiIiJNnBamkpKSAACNG9ue96lBgwYAgMTERGeURERERKSZ0ybtvHLlCgAgMDDQZht/f38AsHtNvczMTKv3GwwGDdURERERlY3TwlRWVsF18nx8fGy28fX1tWhrTVBQkNX7RaTIfdnp50tTIpWAI59TXpzacRxxcWqOl+M46mLiHDPH4Xuscinv8XJamHJ3d4fRaIROp7PZxhSI3Ny0nX0MCAiAj68eSds+0rQess7HV4+AgIByXScvTu1Y5X1xao6XYzniYuIcM8fie6xyKe/xclqY8vPzQ3p6OnJycmy2MS0zHaGyJiUlpdhTeiEhITh54jgTvYM44hMYL07tOI64ODXHy3EcdTFxjpnj8D1WuThivJwWpgICApCeno4///zTZhtT+KlVq5bNNgaDoUTfjwoJCXHIYXJyLF6cunLheFU+HLPKheNVOTjt13zNmzcHAJw5c8Zmm+TkZABAs2bNnFESERERkWZOC1P33HMPgH/mmyrs999/V5N1tm/f3lllEREREWnitDD1yCOPAAB27tyJkydPFlk+e/ZsAECnTp3UfFNEREREFZ3TvjPVtGlTPPHEE1i+fDkeeughfPPNN2jSpAkAYOnSpZg+fToAYNKkSc4qiYjolsMpY8ofn1NyWpgCgE8//RQ///wzjh07hrCwMLRq1Qrp6ek4e/YsAOCdd95Bt27dnFkSEdEtgVPGOJYjpoyhysOpYcrf3x/79u3DBx98gJUrV+L48ePw9PREp06d8MILL2DQoEHO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",
      "text/plain": [
       "<Figure size 700x150 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(7,1.5))\n",
    "conservation_results.plot_score_barplot(k_mer_position, ax=ax)\n",
    "ax.set_title('conservation scores')\n",
    "fig, ax = plt.subplots(figsize=(7,1.5))\n",
    "conservation_results.plot_score_barplot(k_mer_position, score_type='z_score', ax=ax)\n",
    "ax.set_title('conservation z-scores')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: display a pseudo-MSA as a sequence logo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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jCESibB06VJIpcKlOXvppZcEz5HCFxRFCZoK4d5778X//d//CWY/HJQeKMXyActRfao60kMhNENVVRUWLFgQ6WFgzpw5MBqNkR5G1DNjxgwcPHgw0sPwory8HGPHjoXb7Y70UFpM0GJq5syZWL16NR5++OGAz2GD/9j/iL179wIABg8e7Pf5/fr1g1QqhdlsjroPlSAMPXr0EFRAmEymmJnW+uSTT/DHH38IYjs+Ph4LFy4UxHa40RfosWLgChTvKo70UAhN8Morr8Bk8l8NIZxEi6iLZjZu3Ij//e9/kR6GX3755ZeYmq0KWkz17dsX48aNQ//+/f2er66u5uY7e/ToAYqiuERqnTp18vsamUyGrKwsAIjYSgJC+Jk1axbat28vmP3Vq1dzQj5aMZvNgubGmTdvHjIzMwWzH26stVasHrYaf637K9JDIfihoKAA7733XqSHwfG///0PJSUlkR5GVFJWVoYHHniAV5vdunXj1d6cOXOwdetWXm0KBe95piZPngyLxQK1Wo27774bdXV1cLlcANDkKq7k5GQAjBhrEkeARog54uLi8M477wjax6RJk6J6qe2CBQtw4cIFQWxfeeWVePzxxwWxHUncdje+GvkVdr+xmyyBjzJefPHFqAr8ttlsguZti1UoisK4ceN4TcPy+OOPY9OmTX7Df0KFpmncd999KC8v582mUPAatPLyyy/j888/B8B8qdLS0nD+fEM246YCYFUqFQDAYrE03cmb/g9H8qIqmhu+vD307Lb14zFixAjcdttt2LBhgyD2//jjD6xcuRLjx48XxH5rKCkpEWxlo0gkwvvvvy9oXFqk+eXZX6Av1OOWRbdALCX5hyPNsWPH8Nlnn0V6GD58/PHHmDJlit+i3pcq8+fP57XET+fOnTF//nxoNBosXrwYDz74IG+2KyoqMGbMGGzevBkSiYQ3u3zD2xVo7ty53B3AHXfcgWeffRYAvN58U8kCWTEUzcUOCfwjEonwzjvvcGJaCJ5//nno9XrB7IfK888/L9iCi0cffTTgVHxb4uB7B7H2X2vhMBP3dKR5/vnno9JTSNM093tEYGKY+fTWicVirF69miu+ff/99+Puu+/mzT4AbN26NerqiTam1crF5XJhwoQJmDNnDgDg5ptvxtq1aznhFBcXxz3XM+9UY9hzzf2oVlRUwGQy+TRC7NKxY0dBMyVXVVUJXrU+WA4cOIBPP/1UENupqal47bXXBLEdjZzecBofX/cxTOXkOhAptm/fjp9++inSwwjI5s2bsXnz5kgPI+Lo9XqMHj2a11Vy06dPx7XXXss9Zr3i7dq1460PgFmhHY6C2aHSKjFlNBpx66234oMPPgDAJOb8/vvvvabz4uLioFAoADDlZALBxkqlpaU12adGo/HbCLHNtGnT0L17d8HsL168GCdOREe9N5qmBS178+abb3K53C4VLhy8gI+u/QjVf5PUCeGGpmneixn/61//4tUeADzzzDMxtdSeb2iaxn/+8x8UFRXxZrNXr16YPXu2z/GUlBSsXLmSt36AhvipaE1506rafIMGDcKWLVsAMH+oa9asgVwu9+5ALOYi/AsKCvzacjqdXBBu165dQx0SIYaRy+VYsmSJYPbdbjcmT54cFdMQ69atw549ewSxPXToUIwbN04Q29GOvlCPjwZ+hKId/P1YEJpn/fr1vBYX1mq1WLFiBUaMGMGbTYCJ6Vq9ejWvNmOJZcuW8ZoYWCaT4ZNPPuGcJY0ZPnw4/vvf//LWHwBUVlbivvvui0pRHJKYKisrw3XXXYc///wTEokES5cuxYIFCwLGRLGxG4GWqR84cAAulwtKpRJXXXVVKEMitAFuuOEGjBkzRjD7v/zyS8RrdtlsNt7v4llkMhmWLl0a9YWMhcRWZ8MnN32CP7/4M9JDuSRwuVx4/vnnebU5depU6HQ6QcrRzJw5s/lFTm2Qv/76C5MnT+bV5ty5c9GrV68mn/PGG2/w7iDZtm1b1IVtACGIKYfDgdtvvx3nzp2DXC7Hl19+2WxNn3vvvRcA8NVXX6G2ttbn/NKlSwEw04RCBiITop8333wTWq1WMPtTp06NaJb9hQsX8upm92TatGm47LLLBLEdS7gdbnw9+mvsmr8rKjyRbZlVq1bh1KlTvNnTarXcj36vXr1wzz338GYbAC5cuNBmkti2FKvVipEjRzYZsxwsAwYMwDPPPNPs89RqNT799FPeV+G9/PLL3KxYtBC0mJo/fz6XrXnJkiUtmtu+8cYbMXjwYBgMBtx5551czR2KorBgwQJ89tlnkMlkgt2xE2KHdu3aCZr1trCwMGIZf8vLywWriJ6bmytoEH8s8utzv+LH//4IyhW9ecZiGavVyi084gvWK8UyZ84c3j2t8+fPj2jdwHAzdepU/PUXf0luVSoVVq9e3eK0K3379sWLL77IW/8AEz81ZswYwXL0hUJQYsrhcHCqXiqVYtWqVRg8eHDAxv5wiEQifPzxx8jKysLOnTuRk5ODPn36ICsrC9OnT4dIJMLKlSvJXTUBADBhwgT06dNHMPuvvvqqV/6zcDFr1izBVp4uXrwYarVaENuxzB/v/4Ev7vwCDhNJncA3ixcvRmlpKW/2dDqdz1TU5Zdfjvvuu4+3PgCgvr4+KqeJhODrr7/mFojxxYIFC9ClS5egXjNjxgzeU7VUVVXhvvvu45KCR5qgxNTx48dRV1cHgJkr3717d5PNszRMXl4ejhw5gilTpiArKwvHjx+HzWbD8OHD8euvvwoaK0OILdg4PKFif6xWa4tc1Hxy9OhRfPTRR4LYvvPOO3HbbbcJYrstcObHM1g1dBVJncAjdXV1vKffaOyVYpk9ezbv00QffPABr9OT0UhRUREeeeQRXm3eeOONIQWVS6VSfPLJJ7zf8G3fvp1372ioBCWmrrnmGtA03eK2atUqr9enpKRg4cKFOHfuHOx2O+rq6rBx40Zcf/31fL4nQhugT58+mDhxomD2165di+3btwtm3xOapvHUU08JEr+jVquxaNEi3u0KzZUPXwlNevhSmpQdKsPyActRdYK/8hmXMq+//jqviXD9eaVYunTpgvvvv5+3vgBmdW9bDitxOp0YPXo0r59RQkICVq5cGXJi7S5duggSr/bqq6/i559/5t1usJB044So5ZVXXkF6erpg9p988smwuIh/+OEHwYp1zpkzBx06dBDEtpBkXpOJR/Y9gpTLUsLWp6HIgBWDVqBwe2HY+myLlJSU8F5T86mnnmpy4cmsWbN4L4303XffYefOnbzajBbmzJnDe5H3d955p9WF6f/zn//w7kWnaRpjx47ldco5FIiYIkQtOp1O0GDxY8eO4cMPPxTMPsDEGU6bNk0Q21dccQWmTJkiiO1woMvVYfye8ci9Pjdsfdr0TOqE458fD1ufbY05c+bwujJMp9PhySefbPI5HTt2FKS+5rRp09rcis+tW7fyPgU7YsQIXryDIpEIy5cvR0oKvzdR1dXVGD16dETjp4iYIkQ19913n6DTwLNmzWoyM39rWbJkCc6cOSOI7aVLl0ImkwliO1wodUqM3TQWve8PXxFayknhmzHfYOdrO9vcD6nQnDx5kvfM1k8//XSL0qG88MILPkmhW8uBAwewbt06Xm1GkqqqKowdO5bXv+uUlBR8+OGHvMWwpqenY/ny5bzY8mTnzp28rxoMBiKmCFGNSCTCe++9J5hoqK2tFewLWFNTI0jiQQB46KGHMHjwYEFshxuJXIIRq0bgurnXhbXfrTO2YsNjG0jqhCB44YUXQFH8/X8lJiY265Viad++PR599FHe+mZ5/vnnYbfbebcbbiiKwgMPPMB7uZUPPvig2TJvwTJixAhBPI2vvfYaNm3axLvdlkDEFCHq6d69u6Cr795//30cPXqUd7tz5szhNQCUJSkpCQsWLODdbiQRiUQY+uJQ3PnxnRDLwndZOrTsENbcsQb2+tj/MRWavXv34ttvv+XV5tNPP42EhIQWP3/GjBletV/5oKCgQNBSVuHi7bffxsaNG3m1OW7cONx111282mRZuHAhOnbsyLvdsWPHoqSkhHe7zUHEFCEmeOGFF5CbmyuIbYqi8OSTT/LqGj958iSX2Z9v5s+fz3vMQbTQ+/7eGPvzWCi0/ut9CcHZjWexaugq1F+oD1ufsQZN03juued4tZmYmIhJkyYF9ZqMjAze670BTEZtNu1PLPLHH3/w/vlkZ2fzvtDAk/j4eHzyySchrw4MRE1NDUaNGhX2+CkipggxgVqtxuLFiwWzv2PHDl5jJ6ZNmyZIMc5rr70WDz/8MO92o4mO13fE+L3jocvVha3P8sPlWD5gOSr/unQyYwfDxo0bsWPHDl5tBuuVYpk+fTo0Gn7TatTV1QlaeUFI6uvrMWrUKDidTl7trlixwm/eLz4ZNGgQ7yIQAHbv3h32ihBETBFihttuuw133nmnYPanTZsGs9ncajubN2/GTz/9xMOIvJFIJHj//fd5v5OLRlIvS8X4feOR2TczbH0azxuxYtAKFGwtCFufsYDb7eb9By8pKSlorxRLWlpayK9tisWLF6OgILY+e5qmMXHiRJw9e5ZXu//9739x00038WozELNnz8bVV1/Nu9358+cLch0ORNu/KhPaFIsWLRKsbEpJSQlef/31VtlwuVx46qmneBqRN5MnT262SntbIi49Dg9uexDdRnQLW592gx2fDv8Uxz49FrY+o53PP/8cx4/zm0oiVK8Uy7Rp0xAfH8/jiJg0Ji+88AKvNoVm9erV+Oyzz3i3+/7770MqlYalqdVqHD58mPf3ADAxX+EqHUbEFCGm6NChA2bPni2Y/TfeeAP5+fkhv3758uW8FhVlycrKipqyCeFEppbh3q/vRf8p/Nb1agrKSeHbcd9ixys7LvnUCXa7HbNmzeLVZmu8UizJycmYOnUqTyNqYM2aNfj99995tysEp0+fxuOPPy6IbYqi4Ha7w9aE+p7V1tYKMgXqDyKmCDHH1KlTcfnllwti22634+mnnw7ptQaDgfcfHpZFixbxficeK4glYgxfOBzDFw0HhCnX6JffZv6GHx79AW4n/7FvscLSpUtRVFTEq02+vEqBavm1llhI5Gm32zFq1ChewhLaOnv27AmLx5GIKULMIZPJBFspBwDr16/Hli1bgn7dyy+/jOrqat7Hc8sttwi2PDmW6P9kf4xaPwoydfgSlR5efhhrbr80UycYjUbeg7KTk5PxxBNP8GJLp9OFfOPTFDt27MAPP/zAu10+mT59umBTY22RN954Axs2bBC0DyKmCDHJkCFD8MADDwhmf/LkyUG5hs+dOydIwWGlUol3332Xt+zDsU63O7rhwe0PhrVI8rmfz2HVkEsvdcKbb77J+80B37FOkydPRnJyMm/2WKZPnx7R0iRN8cMPP8RkcfNI88ADD6C4uFgw+0RMEWKWN954A4mJiYLYPnnyZFCJ/J599llB5uVfeOEF5OXl8W43lsnswxRJTr08NWx9lh+5mDrhz0sjdUJ5eTnvdTGTk5N5j/GJj4/Hs88+y6tNAPj7778FKXnSWkpLS/HQQw9FehgxSW1tLUaOHClY/BQRU4SYJTU1lfeCnp7Mnj0blZXN/3hu374d33zzDe/9d+vWTdDM77GMLleHh3c/jI438J9BORBs6oT8X0NfoBArzJs3DxaLhVebzzzzjCBxf48//jjv5U4A5vtfXx893ki3240xY8YIWku0rbNv3z48//zzgtgmYooQ0/znP/9B//7CrPQyGo2YMWNGk8+hKEqwVAjvvfceFIrwZQKPNZQ6JcZsHIPeD4SvSLLdaMdnwz/D0dX8lx+KFs6ePYsPP/yQV5tCeKVYNBqNID+QlZWVeOONN3i3Gyqvvvoqtm/fHulhxDz/+9//8P333/Nul4gpQkwjFouxdOlSwRJZrlixosml0qtXr8ahQ4d473fMmDG44YYbeLfb1pDIJRixMrxFkikXhfUPrMf2l7ZH/aqvUJg5cybv8ULPPPMM4uLieLXpyYQJE5CZyX+C1zfffBOlpaW82w2WnTt3XpKpUYTiwQcf5H2VqpRXawRCBLjqqqvwxBNPCFJHiqZpPPnkk9i9e7ePYDOZTM16rkJBq9XyHq/SlmGLJOs66vD9+O9BOamw9Ltt9jboC/W47YPbIJFJwtKn0Pzxxx9Yu3YtrzZTUlIE80qxKJVKvPDCC7z3Y7Va8eKLL+Kjjz7i1W4w1NbWYsyYMaAofv+u77jjDtx///282hSCdevW8VrqC2DKB40cORI7duyAXC7nxSYRU4Q2wbx58/Dll1+irKyMd9v79u3Dp59+6nPhWbBggSD9vfrqq0hPT+fdblun97je0LbXYu2/1sKmt4WlzyMrj8BYYsS9X90LRULsT8kKMV0mtFeKZfz48Zg/fz7vK7ZWrlyJKVOmoGfPnrzabQk0TWP8+PG8Z/Fu164dVqxYIchKSL4ZPnw4jhw5gtOnT/Nqd//+/Xjuuefw1ltv8WKPTPMR2gQJCQlYuHChYPanT5/uFYxaXFwsSDxFnz598Nhjj/Fu91Ih97pcPLzn4bAWSc7fko+V/1gJY4kxbH0KwS+//BJSfrWmCIdXikWhUAiSNJemaUFWDLaEpUuXYv369bzbXb58eUwIKYCJiVuzZg1kMv7zyy1cuBDfffcdL7aIZ4rQZrj33nuxfPly/PLLL7zbLi8vx8svv4z58+cDYO7gbTZ+vR9isRjvv/8+JJK2MWUUKdgiyWtuX4MLv18IS58VxyqwfMByjPlpTFj64xuKongvZgww02RCFLENhFC5oTZt2oRffvkFw4YNE8S+P44ePSrI4pbx48fjn//8J+92heTqq6/G66+/LkiS1gcffBCHDh1Cx46tWxksomMggtJsNnNuYpPJBI0mfAn7WoJobvgSKtKzo/7jiiinT59Gz5494XA4eLctk8nw559/oq6uDgMGDODd/hNPPIHFixfzbjdYyg6V4cNr+F3N1Zhbl9yKvv/tK2gfTosT34z5Bn+v/1vQfjyRx8uhSdWgLr9OsD7UKWo8U8Vvyox169Zh5MiRvNpsa/Tu3Rt//PFHWG52zGYz+vTpg7//5vdvNycnB8eOHWtVkelIQVEUbr31Vvz888+82+7bty927drlFT8VrO4g03yENkXXrl0FucMGAKfTiSlTpghSYLVdu3Z4+eWXebd7KSNTy3DPV/eEtUiyo94hqJASAqfTGZbaZbHO0aNH8emnn4alr8mTJ/MupABg1apVMSmkAMZz//HHHwuSU+z3339v9VQuEVOENsdzzz0nWNbwjRs3Yu/evbzbfeutt6DVanm3e6nDFUl+ZzhEYlKSxx/Lly/H2bNnIz2MmGDmzJmwWq2C9vHFF18Isnpw8uTJuO6663i3G07S09OxatUqQWwvWrQI3377bcivJ2KK0OZQqVRBlYKJNDfeeCNGjRoV6WG0afpP6o+R344Ma5HkWMBsNuOll16K9DBihpKSErz99tuC2c/Pz8ejjz7Ku91u3boJWi0inNxyyy2YMmWKILYfeugh5OeHVuGAiClCm2T48OH497//HelhNItcLsd7771HChmHgUgUSY523n77bZSXl0d6GDHFa6+9hqqqKt7tOp1OjB49mvcSNuz0mEql4tVuJHn99ddx5ZVX8m7XYDBg5MiRsNvtQb+WiClCm2XhwoVhyW/TGqZPn46uXbtGehiXDJl9MvHI/vAWSY5WqqurudWphJZTX18viDdv5syZOHDgAO92n3/+ecFKbkUKhUKBNWvWQK1W82774MGDIdVEJWKK0GbJzs7G3LlzIz2MgOTl5QlWdJMQGF1O+IskRyOvvvpqVBXyjSXef/99XpNIbt68GQsWLODNHkvv3r3x4osv8m43GujevTsWLVokiO3FixcHnd+LiClCm+bJJ59Er169Ij0MvyxZsqRNud5jCbZI8pUPXhnpoUSEoqKimIorjDZcLhdvq4bLy8sxbtw4Xmx5IpPJsHr1at7KpUQj48ePx9133y2I7YkTJwb1fJK0k9CmkUqleO+99zB48OBID8WLf//73xg+fHikh3FJI5FLcMeKO6DL02Hbi9siPZyw8uKLLwqSi+1S4ttvv8WuXbtadW2haRqzZs2CUqlEhw4deBwdMGnSpFbdSFI0xTU35W7Yp90Bj9M0DZFIBLFIDLFIDBE89v0cV0gVkIllIceMikQiLFu2DPn5+aipqQn5vfp9/xQVlOeWiClCm2fQoEEYP358RIuVehIXFyfoiiBCyxGJRBg6ayh0ueEtkhxJjh8/jk8++STSw2gTPPPMM9izZ0+rxUBrsTqtqLXWos5WhzprHbe/cO9C1NmYx0a7ETaXDTaXDVaXldk6rQGP0QhPgmixSAylVAmVVMVsZaqmH/s5PnHZRCSrk5GiTkGKOgXJqmQkqZIgk4S+etczaWdLIGKKcEkwf/58rF+/nve7l1B46aWXkJWVFelhEDyIRJHkSDFjxgzEQOGLmGDfvn346quvcM899wjaj81lw6nqUyjQF6BQX4hCfaHXvtEeu3UhKZqCxWmBxWnh3bZOqUP7hPbI0eUgR3ux6XLQI7UHLku9DGIRf5FOREwRLgmSk5Mxf/58PPLIIxEdR+/evTFp0qSIjoHgH7ZI8ue3fg59oT7SwxGEnTt3YsOGDbzbzc3NjfrYHJPJhAsX+K/V+Nxzz2HEiBG8v/+j5Ufx8dGPsa1wG45XHoeLEqbuYKIyEelx6dAqtIhXxCNBkYB4eTzi5Rf3FfFQSpWQiqWQiCTMVizhHnvuA4CbdsNNueGm3XBRLp99F+WC2WmG0W7kWr2jHka7EXXWOpTWl6LaUs3Le9Pb9NDb9DheedznXIIiAf2y+mFA1gD0z+6PQe0HIVGVGHJfREwRLhkeeughrFixAnv27InYGJYuXQqplHztohW2SPIXd3yB0gOlkR4Or9A0jenTp/Nut1u3bvjrr7+ivkC3wWBAXl4eamtrebWbn5+P9957j7dEkgV1Bbh73d04XH6YF3v+uLXLrZjcfzL6ZfWDTqkTrJ9QsTqt+KvqL+wu3o09JXuwo2gHyk385kMz2o34Jf8X/JL/CwBAI9Ngcv/JmPGPGdDIg89FR67qhEsGsViMpUuX4uqrr4bb7Q57/48++iiuvfbasPdLCI649Dg88NsD+GbsN/j72/AVSRaa77//XpBSSC+++GLUCykA0Gq1eO6551pdg80f8+bNw4MPPgidTtdqW3KJHMnq5NYPqgk2nd2Esvoy9M/qj7zEPLSLawetUgutQosERQK0yotbhbZVcUehopKp0CezD/pk9sFkTIbT7cT6v9ejylLFBbCzAe3+9tkA91D2DXZDSGJKRMfA5Hmw1ZvDjWhu+LJX07Oj/uOKep5++mm89dZbYe0zNTUVf//9N5KSksLabyiUHSrDh9d8KGgfty65FX3/21fQPloL5aaw5Zkt2LdwX6SH4oU6RY1nqoJLKuhyudCrVy+cPHmS17HEileKxWq1onPnzoJM9z3zzDO85oo6XHYYu8/vxv7S/dhfsh9nas/wZjsYlFIlEhQJUMvUUEqVXkHg3GOZCkqJ0iswPNBzW9ok4sj+TQWrO4hninDJMWfOHKxduxalpeGbxnnjjTdiQkgRGhBLxLj5rZuh66jDz1N+Bk3F7o3M6tWreRdSQOx4pVhUKhVmz56Nxx57jHfb77zzDh5//HHk5OTwYu+qjKtwVcZVeAJPAABqLDU4Un4EhfpCFBmKuG2xoZhbrScE7Gq/cCMVS73EWJw8LmDTyDRej5NUSdzKvlRNKrQKreAlu4iYIlxyxMfHY9GiRWGr3TdkyBDcf//9YemLwD/9J/WHLkeHr0d/DafFGenhBI3VasXs2bN5t9utWzeMHDmSd7tC89BDD+HNN9/EmTP8enrsdjteeOEFfPrpp7zaZUlWJ+PGvBsDnne6ndDb9FwqhDprndd+rbUWtbZamBwmWJwWWJ1WZuuyeu1bnBY43JHPQeaiXDA5TDA5TK22JRVLkaxKRqomFSnqFLRPaI9OiZ3QKakTt01Vp7ZKcBExRbgkueuuuzB8+HBs2rRJ0H7YpKGkkHFs0+2Obnhwx4NYc9samMpbf3EPJ++++y5KSkp4txtrXikWmUyGefPmYdSoUbzb/uyzzzB16lRcc801vNtuDplEhlRNKlI1ra876abcPiKrseCyu+ywuWywuy9um3nM7ludVp+cVqxNIdIjAIwwqzBXoMJcEfA58fJ49ErvhQHZA/DPLv9E39TgwhBIzBQPkJip2OTcuXMYPHgwnE7hvA0TJ07EvHnzBLMvBCRmKjD6Ij0+/+fnqPqrKmJjCCZmSq/XIy8vD3V1dbyOIdZipRpDURSuueYaHDlyhHfb1113HbZu3dqiGyiapmGwG7j0AWxGcc/0Av6OsdnHW3qse0p39Ejrwft75Rs35YbJYeJSJdTb61FjrUGFqQLlpnJcqL+AY5XH8MeFP2B2mgUdS6/EXjg2+RgAEjNFiELC7aFp6l6hU6dOKCsrC+NoCLGOLkeHh3c9jHV3r0PB1oJID6dZ5s+fz7uQAmLXK8UiFovx2muv4ZZbbuHd9rZt2/Djjz/itttua/a5IpEIvxX8hhe2voCT1fzHtHlyc6ebcVPeTRjUYRCuancVFFKFoP2FgkQsYVYVKrVNPu9s7Vlc/cHVqHcIV6j7WMWxoJ5PPFM8QDxTLSeaxBTBP8Qz1TxuhxsbHtuAI6uOhL3vlnqmSktL0aVLF1itVl777969O/7888+YFlMAc2247rrrsGPHDt5tX3bZZTh27FiLc8rRNI1thduw8shK7C3Zi7O1Z3kfkycKiQJ9s/ri6nZXI1eXixxdDrITspGoTIROqYNWqYVcErkkrG7KjXpHPQw2AyrMFThvOI9iQzEOlR/C3vN7ca7unKD9Z8RlYFTXUVh4x0IAxDNFIBAIghALRZLnzp3Lu5ACYt8rxSISifDaa69h0KBBvNs+efIkVqxYgUcffbTFY7m+4/W4vuP1AJiVewcvHMT+0v04UHoAB0oPoMrC39Sy3W3HruJd2FW8K+Bz1DI1I6wUWuiUOiQoEiCXyCGTyCAVSxuaSOr9WCyFSCTyynjOZUC/OAXpeczqtMJoN8JgN8BgM8BgN/ASdN5SxCIxcnW56JXeC/0y+6F/dn8MyRkCu9WOhVjYYjtETBEIBEIIsEWSEzsm4ruHv4uqIsmnTp3CihUreLfbvXt33HvvvbzbjRQDBw7E7bffjh9++IF32y+++CLuu+++oIrlsiSrk3Fz55txc+ebuWNGuxFF+qKGtAj6IhQbi1FlrkK1pRo11hpUW6p5W4nHBoRfqOc/J1e4UEgUaBfXzm/LiMtA56TO6JzU2e+Upx32oPoiYopAIHhB0SLIE4SLpxCB8ezEGjQN1NczW09ybu+Ff32TgE2PfgOnWbgl5ewEuTy++emXF154QZAs/23FK+XJK6+8gg0bNvAeElBRUYE333wTc+bMCfgcmgaMLU4PlYAOyp7ooOyJf6QHskfD5DShxlqNWms13BIznLSVW43HrpxrvKKO22/iHEVToGkaFE1xjUajxzQNN+2GWCT2ahKRxPuxWBLwORKxBCqpCjKREgoJ05RSdqvy2GfPKxAvT0C8PAEJCi0SLm6TlCktyi9lMwONs2iFUmaRxEzxAImZajkkZir6OXQIEHJld1ER0KGDcPb5wOUCTp0CjhwBDh9mtkeOADU1wvctEgGdOwO9enm33FxA3IIi9/v378eAAQN4H1dbiZXyx7hx4wTJD6VWq3HmzBlkZmb6PU/TLftMQ2X9emDECOHstwaaZr5PZ84AZ88yzXNfgHUTXiQnA506AXl5zNZzPzMTsFpJBnQCgUBoMWYzcPx4g2g6fJh5bAtD0medrkEs9e7NbHv0AEK9X6RpGs899xyvY2Rpi14plrlz52Lt2rW8p0mxWCyYPXs2li1bxqvdWIGmgaoqX7HEbg0G4fqWSICcnAaB5LnNywO0TS8YDBoipggEwiVDZaWvt+nUKd+pO76RSIBu3Xy9TdnZjCeKL37++Wds27aNP4MXaWuxUo3Jy8vDo48+iiVLlvBue8WKFZgyZQp69Ij+PE+hQNPM9yqQh6nl05jBEx/vK5TYbYcOgCyMNZqJmCK0aUjmcW8ulWlPigIKCry9TUeOAALUt/UhNbXBy8S2yy4DlEph+6UoinilWsHMmTOxcuVKWCz8ZuGmKArPPvssfvzxR17thhOaBsrLA3uYTAIuvsvK8i+YOnVipuqi5RJPxBSBQIhpHA7gr7+8RdPRo8LeEQPMXe/ll3uLpt69gfQAwcFC8/XXX+PUqVNQ8qzaunTp0qa9Uizt2rXD008/jTfeeIN321u3bsWOHTswZMgQ3m3zBU0DZWX+xdLZs8x0uBAolUDHjr5xS3l5zHGhb0L4gogpQliJFs8ICYSPTQwGRih5epxOnAAErAgEgLk7bjxF161beKcRmuPeE/cCAjimjuM4pC9fIj8VEgjyfwgAQ38bCnpIZK8DFMV4Z/1Nx509C/DslPMiJQUYNgzo0sVbMGVkCBuEHy4ukW8IgUCIJWiaueg3nqbLzxe2X6USuOIK74Dwnj2Z6QQCIdb46Sdg9+4G4XTuHCBAHtcWUV0N/PgjcPXVjJdLoYicF1cIiJgiEAgRxe0GTp/2Fk2HDzMXX6Hp2ZNZOs56mzp3ZoLFCYS2wIc8VoWSSJjvamuorwe2b2caS0ICI7CuuQbo04fZduoUe94qIqYIBEJYOXQI2LixQTQdOxa5u+Xjx5m75KoqJpA1NRVISorMWFpLNOegI7n4oh+l0jd9ANvYHGeHDgF79zY0PhZ0GI3Atm1MY0lIYERVY4EVLcHm/iBJO3mAXChiDxIzFRihk3ZGMyIRc/EeNgy46SZg4EBmOoLQOsg10j9CJ+1sTGamr1BiW7t2wYkVmgbOn/cWV4cPCxe/qNU2CCxWZOXlCSewgtUdREzxALlQxB5ETAUmFsRUbi4zLWc0Art2MRnLhUClAoYMaRBXPXvG3vRDNECukf4RWkw99hhw220N3iW1Wri+ACbR7R9/eAussjLh+tPpfAVWx478CKxgdQeZ5iMQCFGLVtsQBM5ur7iCmQZg0euBzZuBDRuYgFs+S75YrcDPPzMNYKYBhw1rEFft2/PXF4HAN7fcwoipcKFUAoMGMQ0Q3nul1wO//so0lsREX4GVmyv8FCHxTPEAueuKPYhnKjCR8ExJpUD37t6iKZQM4W43sH8/I6w2bGBiooSka1dGVA0bBlx/Pf8lKtoK5Brpn0uxNp/V6ht7JaT3CmDiIBsLrJycpq8tZJovApALRexBxFRghBZTGRneaQfYnE1CxCYVFTHLsTdsALZuBex2/vtgkUiAfv0avFb9+4dWfb4tQq6R/rkUxVRjaBooLvb1Xgk1dc/CCiw2wL1PH6YEDfvTQMRUBCAXitiDiKnACC2mioqYi1a4MZuZ6QDWayX03bBGA1x3XYO4uvzy6F6NJCTkGukfIqb8Y7X6xl6Vlwvfb3Jyg7Dq0cOMMWPasJgCYq/eGjve5rbNPUckEkEsFkMsFkMikTS7L5PJoFQqoVQqoVKpoFKpAu7Hx8cjKSnJb1MItJzJ7XTDVmeD3WiHzcBs7QY77EY7nFYnXDYX3HY3XDYXXPZG+za3zzHu+XYXaDcNmvJuYqkYErkEErkEYpkYYkmjq5jHn1Xjv7Fmvya0x/NogHJTcDvcXAMAkVjENBGzFUvFkCqlkCgkkCqlkCqkXo8lConPMc/H8jg5FAkKKLVKKLQKr/3WfEfaqpjyhKKY1AyssPr9d+H7zMhoiLcaNoxZWXWpQMSUfyiKxlzJS4LZF6FBwMs1cih1Sp+m0Cn8HvdqWiXE0sitvKBp/8XIt83dhu0vbfc9wQMOOPA6XgXQhgPQw6H/brrpJshaUSvCc4xN7dM0DYqi/DaXywWHwwG73c5t7XY7LBYLDAZDyGMLFrVajaSkJGRmZiInJwcdOnRA586d0a9fP/Ts2bPJ/ye3w43i3cUo3V8KY4kRxhIj6kvrYSwxwlRh4kRIsCgTlUjploLkrslI6poEbXstlIkXLw4JCsg1ckZ8eLRIXQxomgblpBjRZ3MxQtHqgsPsgE1vg01vg6XKgtpztag9U4uKYxWoPVsLykmF1J9EIUFCdgLTshIQnx2PxLxEdLqpExLzEnl+d7GJWMwkCrz6auDFFxkv1caNjLDavFmYOmRlZcAnnzANYDxVbLzV0KFAfDz/fRKiG5EIEPqqpEnVID4znrnWGGwwlhpDuu7K4yInxkQi/15dsYD/f8HajUkxFQ6+/PJLaKM4mtTlcsFoNMJgMMBgMKC6uhoXLlzA6dOn8fvvv2PHjh2w2Wy89GWxWGCxWFBSUoIDBw54nVMqlbj22msxb948DGKXcHiwf/F+7FmwB+ZK/n6dFFoF7v78bqRdkYb4rPio91SKRCLOI6ZIaNrLR9M09AV6/P7e79j7v70h9ee2u1F3rg515+o8BgFk9c3CnavvREq3lJDstmUyMoCHH2aa3c5kaP7hB0ZcFRYK0+eJE0xbtIgJwB8woEFc9evHHCMQWkvXO7rijmV3cI9piobD1HAjxzWDzeeYXW/3OVdfVg/aHbwai6QYCwfk6xqjSKVSbhoOAGw2G8rLy5Geng6dTofjx4+jTOigkIv9FhUVIT8/36+YGvj0QFw79VroC/WMZ6rUyHmojOeNsNZauak9m8EGu8EOytW0R8ZusOOzWz4DAMjUMiR1SYIuR8d86S56p2RqWYNXStXgnZKpGo6LJCKIJeKG6TexCCKJCJSTgqncBFO5CfVl9TCVmWAsMcJSbWmYNnTTcDvdoFwUKCfFTCPKxNxUolTRME3ntfWYvnNancwFqs4Ga62V8diVGuGytjzyUqaRcVN77EVHlaxCXLs4aNI1iGsXh8S8RKRelgpVkiq4D/cSRaEA/u//mPbOO4zgYacD9+xhpgj5xuVi8mXt2gXMns2kfrj++oZ4q65dL914KwK/iMQiKBKYsABth+AdBjRNw2l2NinCODFmsPscqz5VHZLX3Z8Yqyuoa/6FYYKIqQAsWbIEKlVoPz7s9B07pdfSx263Gy6XCy6Xy2ufbTabDWazGRaLBWazGWazGbW1taiurobJZOLnjTdBfHw8srOzkZ2djdzcXPTo0QMDBw5Enz59mvQOicQiJOYltmiKiaZpZjrM6idO6mI8lGdsVKCYKofJAbvRzggf2jd+iqaY2CZ/x2maBijvcyKRCOoUNRfzBBECbtl9VqyJpWKffZFEBKVWCXUyY9PtaPTebH7eb6P/B7fdzYlA0GAuXkY7jKVGVP1VxcWGKXVKxGfFIz6TaQlZCdw++54I/hGJgB49mDZ9OpPDatMmRlht2sTkuRECoxH47jumAUw+KzbW6sYb21aBWEJsIRKJII+TQx4nR0J2QvMvaARN03BZXUGLMLbVnq2FyybwUr8QiMkAdEJwiEQiKBQKyOVyqNVqaDQaaDQar32NRgOdTofExEQkJiYiKSmJ209LS0N2djYSEoL/4rQUiqZQb6+HwW6AwWaAwW6A0W6E0W6E1WmFzWWDzWWD3W3n9gM1J+WEi3IFbG7K7fWYBg2ZWAaxSMyIIIhavKWbCT6gaApuys2NyU25mYUEIjFnRywSQyKSQCaRQS6RQyaWQSaRcdvGx+QSObevlqkRJ4/zaRqZBnHSOGgkGujidciMz4RSqmzZZ0EBDgcfnyqDzWVDrbUWeqsedbY6mKla1NlqUWerg8lh8vp8rS6r99bjnM1lg5t2c/+nFE0x+7THvp/jNE1zn61YJOb+77l9j+NikRhKqRJKqRIqqYrZylTejy9uFWI15CINlBIl9zyFVAGVVAWVTIVEZSKSVclIVidDp9RBIuangrJIFHslbkgAun9omobb7ls9ONQbeX9QF/+1JSSQQAT+/6asHkVCzWYzdCk6AG04AD0crF+/nhcB19KVfOxqPX/n2BV6LVnBJ5FIIJfLOfEkl8shkUgiGlfkcDtwouoEjpYfxYmqE7hguoByUznKTeXQ2/Qw2Ayod9SHbD87IRudkzqjU2IndNB2gE6pg1ahhU6pg0augUrK/MixP5IKScO+UqqEVCwN2/8PRVNwup1wUk7YXXZYXVaYHCaYHWZm6zSjzlqHCnMFyk3lqDRXgqIpSMQSiCH2+tEXi8RwU27U2+thdphRJapinifyfZ5YJEa6Jh05uhzkaHPQXtsecXL/f99iMZPJuCUYbAYU6gtRqC9Egb6A2y/UF6LSXIk6Wx1sLn5i92IZEURIUiUhRZ2CVE0q2ie0R64uFznaHOTocpCry0XnpM6Qiskl+VJCJBJBqvT9zF0Ir+clBnwqYUfqDu67SDxTAdDr9VEdgB4rvL3vbTz3y3Owu/nPlnhzp5ux5u41SFRFZoValbkKT29+OiJ988WkfpPQN6tvi59/3nAea/5cg93nd+PghYO4UM9D2fgAyMQyJCgSEK+IR7w83ms/Xh4PhVQBqVgKiUjCbMUSn33WG8R6I9202+++k3LC5DBx3tB6Rz23X2etg5MSqHqrB2qZGn0y+2BA1gAMyB6A/tn9kRnfNvInEM9UcET7oppYJFip0+aTdoYLIqb4o95ej8Plh/HHhT9wtvYsSutLUVpfilprLeqsddDb9M1OlwVCBBHaa9uja3JXdE3qilxdLpJUSdApddApdYhXxHtNzfDpkXK4HThZdTLk17PQoLmpQIfbAbvLzk1p2l12bMnfgo+Pftzqfvzx1T1f4e7L7272eX9W/omnfn4Kv+T/EvJn1Rx3dr8Tt3e9HX0y+6CDtgO0Cm1U/KhQNIVKcyWKDcU4XHYYe0r2YM/5PThbe1bwvvtn9ce86+fhpk43Cd6XkBAxFRwkqXDkIWKKJ4iYCh9svFSdjRFWddY6JrbGYYbVZYXVafWKofE5dnHLxkA53Q0xU57xU42P0zQNqVgKpVQJmUTmExMlEfmfMmOn0tiYKZqmmdici/vs1tP74abdXMwUu8++zk27ubipQN4V1gPjGUvVOH7KK77q4uPGQpKN/2HbwPYDW+T92HhmI8Z+Oxa11lrB/g7yEvNwfe716JPZBznaHKRp0qBVapGgSIBWoYVCGl2BQmdqzuCjwx/B5rJ5xb95/h15xuG1Zv+Rqx9BvCJ2E1ERMRUcRExFnjYvpp5XPw+5SLiCV2KZGAnZCUjPS0dix0TocnVeTalrYTBJlLHksiUwlhgFs9/xho4Y9d0on+NDhw7FoUOHBOvXE6VSicREfqb8WEHErdIDQIsuflVE4EQT93ya9lo56HYxqzEpioLbdTEDuscPrlgs5uLkPBsb9yaVSiGTySCVSrnm+Zjd98xi79nUajW3TUhIgFarhVarRWZmJjIyMiAOoYaF3qbHur/WYX/Jfuwv3Y8TVScE81L5QyFRMMLqosBKUCT4eBx9HsuaPh/oeQqJgreA8VjA7DCj0lyJGmuNTwyfyWHyOmZxWmB32+FwOzhvqsPtgNPt9HvMRbm4RQE0aG5RQHPHAAQUpo23UrGUu5lgbyjYffaGw985r/2LNx/x8viG6WSPrU6pQ6o6FSpZZFKM0DQNk8PktUjHYDPA5DA1uyjH5rLB5m7Yb2pBDnecbjhO0ZTPjQK7BRDwc2HxFIeNJQd7Q+l0O0GD9rkxYT93qVgacFGO35vLi481co3fRTqeLVGZiFRNKsSihutisGIq5qIdRRbvD4lvaNAw6A0w/Ok/w7giQcEJK22u1q/YioapicY4zA44TDwu0WqE0+o/psRisYQlbQMA3HbbbVizZk1Y+goGNu2F0+mEzWaD3W6HzWaDzWaD0WhEaWkpzp49i59//hm//vqr4OORy+Vo3749Bg8ejMWLFyO+ham3dUodHr3mUTx6zaMAAKPdiN9Lf8eximMoMhShyFCEQn0hivRFqLPxn//F7rajylKFKksV77b9IRPL/AovTwHGXZBlTV+s4+RxSFIlIVWTinh5eBPN0jSNc3XncKD0AM7VnkOBvgDlpnLm/9JchUpzJawua/OGgsBTvKpkKsTJ4pjVjhImzq2xl5d7fNEbLBKJvMRV41WbbHO4HbA6rbA4LbC6rKiz1sHqYh5TtDAr2DQyDbeQoF1cO3RK7ISuyV3RJakLuiR3QfuE9kELcavTij8r/8TRiqM4XXMa5aZylJnKUGmu9FrdHMp7YkMh2EU6mfGZ3CIdrVILjUzTcBPhZ6GOQqoI282FZ7iD0+2E3W2HxWnhxDwr7muttdwiphprjdfqXFYQuWk37G47nDYnjHajz99Y46aUKtFe2x452hx00HZAoiS4G/OYE1ORxm60o+JYBSqOVfg9H6tiqy2wa9cu/Pvf/w7ptc2V/2nqfKByQBRFcSLKszkcDi5fmMVigdvtuzS6MSKRCHK5HDKZDDKZjNuXy+U+tRbZbUJCgleLj49Heno6srKykJmZibS0tJA8VCwJigTcmHcjbsy70eec2WFGna0OddY6JjbOVsfFyHk9vrg1O8zcDyL74+imm/9/ERIn5YTT4WzVSlN/yMQy7sc4RZ3C7KtTkaPNYX7wkjqhU2InaOStL+j+9M9PY92JdSgxlvAwcl+kYimeHfgsbu1yK9rFtUOqJhVx8jivO/xIQNM0jHYjykxljDCpL0OhvhC7zu/CruJdMNpD99KbnWaYDWYUGYr8nldKlRjeeTgm9pmI/+v0f82O88HvHsSnxz4VRPw9M/AZzL1ubsS8aQdKD+CDgx8I2odaqvZ7nKZpJswCLb+OFOoLsRM7AQBOW3CLTmJumm8GZkAOYab5ut/ZHZSLgr5QD32hXhBPTqTE1sIOC2E8L9w0X95NeRi3eZzP8b59++LgwYOC9evJ8OHDMX/+fF5s+Ss+3dy5xvv+pvD8HReJRJBIJAGbVCqFRHLpTDmxON1OTmBZnBYuTo7db3yOnX7yDOD32jY+7rL75rdyWsOycq8lpGvS0TmpM67OuBoDsgfgls63BL1y9UzNGaz5cw0OlR3CmdozOFd7TpCVtVKxFOmadKTHpSNOHge1TA21TA2VVMXts00hUXhNvXlOzwT72HO/pQLORbmgt+kD5o8D0OpzwUDTNC7UX8AfZX/gcNlhFBoKUWIswYX6C0x+Npu+VelFFBIFOid1ZhbpJHdF+4T20Cl1SFQlQqfUIU4e53cqnI+UMTWWGuTX5bfKBgu7UKfxd9zusmPZoWXYWbyTl344HMDFOsdtM2ZKSDH18J6H0f7a9gCYP3BbnY0TVvoiZmsoNDD7BXrYjfxflHzEVk4jsZUYmti6FMTUqFGjonKary3iGTzPJsv0DLZvfIx9ruf5Lkldoi6oHGCmGliBZXFaUG+v59IlsPvVlmqUm8pRYa7AeeN5HCk/0ipvR0vQyDQYf9V4TL12KnJ1uSHZcFNulBhLcLb2LJfHjJ3uq7JUwWg3NsRIecRLOdzChQjwhVgkblJssfueU1lck/hO4yqkCqhlaq+0HAmKBK/H4fLC2Vw2buWz50Id9oai8eIc9u/X85zdbQ9qkQ5FU5CKpZCKpVBIGQHsb0q2qSYSibh4uMYLdNhrgufCHM+0JQ63gxsH+3x2YVDjBTqe26Y+e3/7jZPzsoJS5BThsYGPAWijMVPhQiQSQZWkgipJhYyrM/w+x6a3cSKLbYYiA7dvqwv+bqK5aUR5vNzHm8WH2BKKLVu2tGgaiw/kcv8i22QyoaioCIWFhVxjHxcXF8PpFMYTkZqaipycHL8tMzMT0iitZOuiXJi3fR4+PPQhk3Xcj1DiY0oiIy4Dj17zKIbmDEW/rH68TGvxgUQsgUauCWo8FE3hpzM/4fY1tws2LrPTjHcOvIN9pfuw/5H9IdmQiCVM4lZdTlCvc7qdnLjyDE5nA83tLju373A7uAB1f+cbn2OD1tlkti3Zega6uygmwSVFU4ynEeFLEisRSbjYqXRNOrfNjM9El+QuuCzlMuTqcoO6JkfrSr7GQijQSmZP8cTuN/bktaTahKcgiwRmsxmP4bEWP594pjzw9Ezxgd1ob/BoeYgsdt9SbeGtL5ZAYmvDhA2wVPHfH0sgz1Q4qK+v9xFJnq2mpiZom+3atUNeXp5XS09PR1lZGfLz81FQUMBty8vLg7YvkUiQnZ3NiasOHTp4ia0OHTrwWlIiFMpN5Vh+aDk+P/45Tla3Pp9WU0hEElyVcRUGZg9Ez/SeXGbwzPhMaGSaqLpBoGkaNdYanDecR6G+EAdKD2BvyV78fuF3WJzCfcfi5HEY2WMkJvWbhN7tevucr7ZU46/Kv7gfsUCtcWC3z/kmXq+QKHBDxxvQMbGjYO8zWGia9lpB6HA7GqZvPVKomB1mGOwG6G166G16lNWX4VzdOewq3gWz0yzY+DoldsLtXW/H1GunooO2Q7PPj1YxdanR5lfzxRKKBAXSe6Yjvaf/qqQOkwOGYkNAz5a5MvgvuKPegcrjlag8Xtna4UcNBoPBr0hij9XWBp/7SKlU+ogltuXm5jb7xfHEYrGgsLDQS2B57tfX+wYwu91uFBUVoajIfxArAKSlpQX0bOXk5ECn0wX9voOhXVw7zBwyEzOHzITBZsDBCwdxoPQADlw4gP0l+1FmKuOtLzftxsELB3Hwgu+UsFQs5coDNW7x8njIJDJuOoJtMrHvMTbmwnPZd6DHFqeFWXp+cfm50W70WpLOekOERC6Ro1d6L/TN7ItB7Qfhzu53NuktS1YlQyPX4Is/v8CflX/iZPVJFBuKBRlbRlwGuqV0Q/fk7uiW0g1dk7syAehqJqg+nAHPIpGIS2/QFDRNo95RjxpLDS7UX8DpmtNIUCTgQv0FHK88Ltj4DHYDSupLUGeta5GYIsQmxDPlAd+eqdbitDgbxFbjmK1CPUxl4Uk50BJa45nS6/V+RRLb9Hp90DZFIhHUav+rPGQyGVJTU1u1kq2l0DSN2tparwKanrCr+0IhISEhoGcrJycH6enpgr1HmqZRbipHfl0+kxZBfzEtgqEI543nUW2pRo2lJuIr8qKZVDUzPeTZMuMz0TW5K7old0OOLqfVtfpMDhNO15zGyaqTOFnNtEJ9IRcjJVTdRKlYCrVMDY2MmS5l99UyNTRyDRd/4xnr4vexWOJTxNqrsLXHvoty+SxM8Gxmh1mQxQVikRip6lSkadKQpklDu7h2yEvMQ+ekzriy3ZW4Iu2KoOKqiGcqOiCeqTaETC1DSvcUpHRP8XveZXMxYqvIv2er/kI9wphT0S80TaOuri7gFFxRUREMBv85vZojLi7Oy6PUqVMnbj8nJwcKRfQFNzeGpmlUV1f7/L8UFBRw+4GEmNFoxPHjx3H8uP+7aoVCgfbt2wf0bGVnZ0Mmk4U0bpFIhIz4DGTEZ2AQBvl9DkVTXLA222osNV4pELhA2UYZ7QOe8wiyFTJhaONAWrlE3mTOKX/BzGyCUa1Cy+2nqlOREZ+BVHUqZJLQ/u+DIU4eh6szrsbVGVf7nKNpGmanmRNWepveJ9ie3ZqdZp+ptMbJOv01s5NJkWF32cOa4JXFMyg9QZHgE4DsmfxRLpFDIVF45QbTyJiEj56JHzUyDXRKHdLj0pGmSUOSKiniqSBaQzRNoUcDoYrLmPNMlZ8rh0YtTKCqKkkFiTzwEnSKolBRURFwuikUD0pLUKvVnOfBX2yNUuk/K7vb4Ya1lt9kfIGQyCVQJfm69i0WC4xG/6ucnG4naq21qLHWQG/Tc+VjLA4LLC7v5e8ut6shmRvlhFvkBlTwPtYoUNrfKjJ2S9M0ZBKZV5LAQMuaAyWJ5TKjX/wKsYkGadDclJG/jL6NgzA9M/s2zvArFUtBmSlIaKaUjFQk5aa1ZBIZlBJmFYpKqoJazixFj5PHIVmdjBR1CpJUSQGnP8RiMVJSUsLioWstdrsdBw4cwPbt27Ft2zb8+defXhnp2S0tor0es439HEADYGPnaUBEXzx2sWnUGgwcOBBDhwzFkCFD0LVr15j5sXE4HDh//rxfQV5cXByyB9STlJQU7oalY8eOQU2NuylmhRb7/fO3uqvxMRq0TybsQI8DnfOEpmlUVlYiPz8f586d41p+fj6KiopavRhFqVQiJycHubm56NixI3Jzc7mWlZUV0s0L5aJgr7fDbrDDbrTDZrDBbrTDZXPBbXfDZXPBZW9+3213w2V3MfsON2h3Q8UGf00ik3hVgOC4+LDx8SalBN3oPA24nW7mWigO3MQyMaQKKaRKKSQKScPW81ij81JFw74iXgFFggIKrQJKrRKKBEWTv/GetPlyMi15U6FCURTKy8t9xJLnBcluDy4dglwu97rosBchm83mFVeTn5+P8+fPh7TyLT09vcnYmmiqMUjRFFYcXoF1f63DqZpTqDBV8J73RiFR4PqO1yNXm4v0uHSkqlO5qQY27w1bj48VL/6mF1p6rKm7Ujajr4tyweF2cNl82VZjqeEyh1udDcLXM2+N52N/x/yVbfB8TqIyEWmaNGTEZ+C63OuQpEri479ZUOx2O/bv349t27Zh+/bt2LNnD2y28K3SYklLS8M//vEPDBkyBEOGDEHPnj1jMueX2+1GWVmZl8DyFF3nz5+Hy9W6OLD09HQfkcXuZ2Vlhe3/zel0ori42EcssdvWVGSQy+XIycnxEUpsC2VqnXJTKN1fiopjFTCWGGEsMaK+tJ7ZLzXCUR+aCJYoJEjqlISkLkyLz4yHKlEFpY4RFVIVI0KkSilkKhm3L1VKIZFLIBILexNB0zTcjouiz1+zumCvt8Omt8Gmt8FcYUbtmVrUnKlBzekaOM2hCV+pSor4zHgkZCcgISsB8dnMfkr3FOT8IwdSJTNhF9ViymKxYMGCBfjiiy9QUFCA+Ph4XHPNNZgyZQpuueWWgK/jS0yxF5RAU06h3r2xFxF/LTMzs8VfLqfTiZKSEr9BzPn5+aiqCq2MhlarbVJspaWlRezum603VWWpQrWlmisZwMY4sMuvA00lNJ568PRQNc5f0jiPSeNzns/3F6PhL2aDpbHgCrTPiq/G+42DpT0bW+jYM7haIVFwZR7Y3DnsMZVU5TMtESePg1apRbomPWpSEHhis9k48bRt2zbs27ev1eKpS5cuGDZsGJRKJbZu3YqjR4+2epxarRaDBw/mxNU111wT8lRpNOFyuXDhwoWAU82h3uixyGQy5OTk+IgsdhtsTc36+nq/YuncuXMoLi4OeaysWPInlHJzc9GuXTtePbk0TePr0V/jr3V/8RqS0e7Kdvj32n8jMS8RYmn0e56DxVRuwg+P/oDTP5zm1W72tdm4/9f7IVPJoldMmc1m3Hjjjdi/fz9kMhmuuOIK1NTUoLiYWW0yZ84czJ49O+BrW/Km3G63zwXBUzSFmlNIIpEE/AKlpaUFLe4oisLZs2cBAJ07d27xl9NkMgUUVDRNh3xnqVQq/QYws8eys7NDzolUZ63DobJDOFl9ElVmJi7Dnyu/qS1wsfBwgPNyiRzZCdnccvpkVTJXoJTNxtxasejvb5AdQ6DpxMbH/CXLY3PwsLFFF+ov4EjFEWw6u0mwZfZx8ji0i2uH+3vdj2cGPQOlNPzFu61WK/bt28dN2+3bty9or29jUlNTMWzYMAwbNgw33ngjcnJyvD63goICHDhwAL/++iu2bt3KfQdbg1qtxrXXXsuJq/79+0c8pYUQuFwulJaWBvRslZSUgKJCzz2m0+k4YZWdnY1FixYBADZt2oTy8nIf4RTqjSUr6gKJpVCLgLcWS40FVX9VwVhqbPBOlTDeKZve1jC1Zw3uGi+WiZHUKQnJXZMRlxnn45ny8kipvL1UEoUEYom4YdpN0jD95rK6UF9WD1OZidtWFlTinhX3AABW37kacshBuSi4nW5QLuZvQyKTQCwTQyKXcNNx7FRd42k6iVwCR70DNr0N1jorLFUWzmNnKg/OuyiRS6DUKZn3rlVAk6qBpp0GcelxiMuIQ2JeIjKuzkB8RkOd0qgVUw8++CA+/vhjXHnllfj+++/Rvj2zau6TTz7Bww8/DJfLhS1btmDYsGE+r/V8UydPnkRlZaXfuKXi4uKQBUVmZqZXAHPj/EJ8em6EmrZsnEKg8YUv1JgusViMrKysgJ6tDh06BFw51xi7y44aaw2qzFVcUDKbeZn1RlmcFqb+lYdXqnGyvsaJ/Bo/z0k5Oc+RWCRGnDzOb3Zkz/ikpmIwKAeF3/7zGwBg2PJhkCgkAWM8Giet8xwXK6LYY3aXHSaHiVtl5M9r1biMhr8mk8g4j5RGpuFWUbHbBEUCt+IoVZPKTX2GC6vVir1793LTdvv27Wt1DI9arcbQoUM5AXXFFVf4/BA29V0rKirC1q1bOXFVVtb6VA8ymQx9+/blxNXAgQOjappdKFiveiDPVklJSVhWjclkMnTo0KFJsRSL07QsboebiZ+6GDPlGQvlEydld/nGSnk811+cFGj4j6FqIraKfY3VYcVjO5gkl8uuXwaFVMH8brJxV362YokYYqkYIokIYqmYEW9SkfdxiRgQoWHstibeW6P3T7tpKHVKburSS7gpmGNimRgSmQSqFBXiM+O5JkmUoGNfJp9a1Iipc+fOoVu3bqBpGsePH8fll1/udX7mzJl45ZVXMGjQIOzatcvn9Y3FlL8fbovDglprLWpttai313sVTLU4LdxKIAfVsALFRbngoBwQa8SgpBT3Y81OA7W0TAYb3MpWQ/eEDTb2hHJQOD6ZWYHVc1FPSBT+v9w0zQQyewZhegZKNz4mEUt8Apk9xQNloQA7GqaLPAKa5RI5k1ZfpvSKLdIpdUhWJSNJndSkByM1NdXvHblobmwE7zaLR50mzAAEys4RdujZwnz9LRYL9uzZw3meDhw40GrxJJFI0K9fP048DRgwIGDWe5aW3rjQNI2///4bv/76K3799Vds27aNlwUlYrEYV155JSeuBg8ejNTU1FbbDRW3w90QxHwxoNlhdoQeyGxnvA7N/eBSIgpGl9FnRZ+/4GaHy4FZx2YBAOb1msctoKBp2u9UGE0xiw6kEiYfmUQs8Q1mlohaFcgsU8uYAGYtE9Cs1CpbHMjcHI1Tw3iK0Lq6ulbbl0ql6NChg99YNj4dBULGNrvdbpSUlPhM6ebn56OysgU5FWkmjlRMiyGGGCJaBPHFfwAgS5Ahp5O3xzI9PR1Dhgxp8fsJi5iaM2cO5s6dG1AslZaWIjs7GwBzt9ihg3dis0Af0rGKY/jf3v/hjwt/oFBfKEgW2yvSrkCfzD5MEU9NOhIUCYzYkKk40aGSqaCQKLhVVs3FydgsNqQnMYk8DUYD4uPim/yD9vRusFNFVpeVK+tgcphgtBtRYixBkaEIleaGPy6/QcpBBDB7HtMqtFwuFTZ/SqysdPJHUEKvlWJKKNESLZjNZuzZs4fzPB04cID3Mj2ZmZlBe3koisKpU6cAAN26dWvxFI7b7ca5c+cEKYV0+eWXY8iQIVxgO3vt4wNTuQlFO4tgKDZ4BzKXGGGpssBlC81zr05VI7lrMpK7JEPXUQdVkoqbMpHHyb2ClxsHNQcbzBzsjzJNeQcyO61On2Bmh8kBu4EJZrbWWqEv0KPmdA1qztSEXBlCqpRCk6ZBfNbFYOaLTdtBi5whOdCktV5M6PV6brah8UxDQUFBwJXSLUWlUvnEr7H7HTt25D6HltBaMWWxWJCfn+93pWVhYWGrbsbi4uI4keRv8UBiYqLPb1lU5pnau3cvAGDw4MF+z7NTSEVFRdi+fTvGjWtZ8sde6b3w8Z0fc48tTotXwc7GwcxWl9UnkDlQ7hR2Ca+bcqNQX4hztedaFLjsL9DZJ+mcveECrX1dC8jBeZZaGsgcSKw1Fcjsr7G5VRoHMbN5ddjgZc9cK/HyeKRqInd3TYg8JpOJE0/btm3D77//3urVYABTxqepC3iwAs0zjsfpdAYVD9OxY+CSKeXl5SGvCjtx4gROnDiB999/n+uH9VwNGTIEnTp1Cukm5e/1f2P9A+v5LcAuAu5Zdw+6/LMLZKroDLQXiUWcgAsWt9ONE1+ewDdjvgn6tWyeP0Oxb548ZaISd312F7rc0iVou57odDrodDr07u1bPggAl8PPXxxbQUFBs3+jVquV+3v0R1paWkCxFWwsLU3TqKqq8vEusY9bM82u0WgCrrDMzc1FUlKS4Df+YRFTbKBnp06dAj4nNzcXRUVFOH3aNzrf03m2dNtS6N1M5WzPOBWpQtp8AHMzwc4iiJCtzkZ7bXt0SOiAjPgMrwRufAQyA4ziTX+Z8UyVPVkGlVrFCa2AgcyNxJrT7WS2Ht4qu9vOBTNXmitRoC/AL/m/IL8uv9Vj9odCqkCaOg0903ti3vXz0C2lmyD9CEYwNzqOAPstxGwWrvZXOKivr8e+ffuwc+dO7Ny5E4cOHeLFa6PVajF06FBcf/31uOGGG5CXl8d7fGJ6OvNd27t3L29TDy6XC4cPH8bOnTuxfft27N27FxZLaB4O9ofv44+ZG8P09HQMHjwYgwYNwqBBg3DZZZe1SAS2v6k9/lv4X5QfLee8UvUX6mEsZYKZLTUW2I0N8TYtggY+u+czAEBCdgKSuyRDm6OFMlHJNK0SMrWsIYBZ0eCV4qbLVFKvQGbPfZqmYa4yw1xuRn15PUwXTKgsavCsr31gLRfITLkoUE4KlJuCWCrmgpnZ2BfPeBjPmBipQgrKRXFTm9ZaK0zlJtRfqIe+QA+XPbibAJlKxkz3aRVQJaqgSdNAk6aBOk2NxNxEJHdNRrsr20EsFQv+vZfL5ejatSu6du3qc45NmFxcXMyVrmJbcXExCgsLm/2braysRGVlJfbv9y2sLZFIvOLTMjMzuXM//vijVx1TtoX6/6FSqZCbm+u1UMpzvzmxFMp303OsLZrAo8NAXFwcDYD+9ttvAz7nrrvuogHQEyZM8DlXUVHhkVaPNNJII4000kgjLTytoqKiWZ0TljWgrCoMlKkbABe8HOrdHYFAIBAIBEIkCMs0n0QiAUVRTbrh6ItuNH/u7JSUFFRUVMBsNkOt9j/VJlRWdAKBQCAQCJcWNE1zzp2UFP/1cT0Ji5iKi4tDXV1dkxmN2XP+lteLxWKkpaUJNj4CgUAgEAgET4JZzRiWaT5W1dXU1AR8TnV1NQAQ0UQgEAgEAiGmCIuYuuyyywAwq1YCUVhYCAB+VyUQCAQCgUAgRCthEVP9+/cH0JBvqjGlpaVcjb6BAweGY0hhY9WqVUyG8iDbddddF+mhX5LcfvvtEIlE6N69e4tfU1hYCLGYKUWzceNGAUdHaIrCwkLu+/PAAw80+/xt27ZxzydEF2vWrOE+m4kTJ0Z6OIQWcil/bmERU/fcwxQ/3LZtG5eN2JOlS5cCAIYOHYrc3NxwDClspKenc/liPBtbm1ChUPg937NnzwiP/NJk/PjxAIBTp07h4MGDLXrN6tWrQdM0srOzcfPNNws5PEILWb16NTZs2BDpYRBCZMWKFdz+p59+ivr6+giOhtBSLunPLeTkUUFy33330QDoyy+/nD5z5gx3/JNPPqGlUikNgN6yZUu4hhNxZs+eTQOgc3JyIj0UggdOp5NOT0+nAdBTpkxp0Ws6d+5MA6BnzZol8OgITVFQUOCVGyYjI4Oura0N+PzffvuNey4heigqKqLFYjGdlJREDxgwgAZAL126NNLDIjTDpf65hcUzBQDvvPMOrrjiCpw4cQLdu3fHVVddhdzcXIwbNw4ulwuvvPIKhg0bFq7hEAh+kUqlXDmjL774otks37t378bZs2chEonw8MMPh2OIhBYgEolQVlaGJ598MtJDIQTJypUrQVEUBg4ciDvuuAMAuNI7hOjlUv/cwiamkpOTsW/fPsyePRtdu3bFyZMnUVNTg6FDh+Krr77CjBkzwjUUAqFJ2Km+8vJybN26tcnnsiVAhg0b1uamqGOZxx9/HAAz1fD9999HeDSElkLTNPeduvXWW3HvvfcCAI4ePYp9+/ZFcmiEJiCfWxjFFMAk1pwzZw5OnDgBm82G+vp6bNu2DXfffXc4h0EgNEn37t1x7bXXAgA+++yzgM+z2Wz48ssvATQIMEJ08OSTT+If//gHAOCxxx5DbW1thEdEaAm//fYbCgoKIBaLMWLECHTq1An9+vUD0BBbS4g+yOcWZjFFIMQKrDj65ptvYLVa/T7nu+++g16vR3JyMv71r3+Fc3iEZhCJRFi5ciXUajXKy8sxadKkSA+J0ALYAObrrruOK5x73333AQDWrVuHurq6iI2NEBjyuRExRSD4ZeTIkYiLi0N9fX3AaaLVq1cDAMaNGwe5XB7O4RFaQKdOnfDaa68BAD7//HOsX78+sgMiNInBYMA333wDABg7dix3fPTo0ZBKpbDZbFi1alWERkcIBPncGIiYIhD8EBcXx6X08DfVV1FRgc2bNwMAHnnkkbCOjdByJk2ahCFDhgAAJkyY0GQVBkJkWbNmDaxWK5RKpVfoR1paGrc46YMPPojU8AgBIJ8bAxFTBEIA2Km+TZs2+fwIf/bZZ3C5XBgwYAB69OgRieERWoBIJMKKFSugVqtRUVGBJ554ItJDIgRg5cqVAIA77rgDCQkJXudYj8epU6fw22+/hX1shMCQz42BiCkCIQCDBg1C9+7d4XQ6uUBzFnblCgk8j346deqE119/HQCT7oKdkiBEDydOnMCBAwcAeE8VsfzrX//iis5eKgHNsQD53BogYopAaIKHHnoIgPdU39GjR3Hs2DHExcVh1KhRkRoaIQieeOIJbrpv4sSJXGF1QnTw0Ucfcft33HGHT3ktjUYDk8kEAFi/fj0qKioiNVSCB+Rza4CIKQKhCR544AFIpVLs3r0bRUVFABq8UmyQOiH68Zzuq6ys5PJQESKP0+nEp59+CgDQ6XTIysry29hVYk6n0+tHnBAZyOfmDRFTBEITpKen45///CdomsbatWu5LUACz2MNz+m+devW4auvvorwiAgA8OOPP6KyshIAsGXLFpSUlPhtpaWluOKKKwAAy5YtA0VRkRz2JQ/53LwhYopAaAa2TMw333yD3bt348KFC+jRowcGDBgQ4ZERguWJJ57A0KFDAQDvvfdehEdDABpyFPXs2RN9+vRp8rkTJkwAABQWFmLjxo2Cj40QGPK5eUPEFIHQDLfeeisyMjJw4MABLFq0CAAJPI9V2Ok+jUYDmqYjPZxLnvLycu7HtSW1LceNGweNRgPg0qr7Fm2Qz80XIqYIhGaQSqW4//77QdM0vvrqK8jlcq4YMiH2yMvL46b7CJFl9erVcLlckMvlfleDNSYhIQFjxowBAPz0008oLi4WeogEP5DPzRcipgiEFuB593XnnXciJSUlgqMhtJbHH3+cm+4jRA42M/btt9/e4u/UxIkTAQAURWHZsmVCDY3QBORz80VEE183gUAgEAgEQsgQzxSBQCAQCARCKyBiikAgEAgEAqEVEDFFIBAIBAKB0AqImCIQCAQCgUBoBURMEQgEAoFAILQCIqYIBAKBQCAQWgERUwQCgUAgEAitgIgpAoFAIBAIhFZAxBSBQCAQCARCKyBiikAgEAgEAqEVEDFFIBAIBAKB0AqImCIQCAQCgUBoBURMEQgEAoFAILQCIqYIBAKBQCAQWsH/A2pMC9La6X3lAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 700x150 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(7,1.5))\n",
    "conservation_results.plot_sequence_logo(k_mer_position, ax=ax)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/q4/k476_qrd3jvdvzwd6lq30kqc0000gn/T/ipykernel_96254/1814068924.py:7: UserWarning: The figure layout has changed to tight\n",
      "  plt.tight_layout(h_pad=0.5, w_pad=0.5)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x300 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams.update({'font.size': 12})\n",
    "fig, axd = conservation_results.plot_conservation_mosaic(\n",
    "    position=0,\n",
    "    score_type='z_score',\n",
    "    figsize=(8, 3)\n",
    ")\n",
    "plt.tight_layout(h_pad=0.5, w_pad=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### getting the average conservation score for a query k-mer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can use the ``get_average_score`` function to get the average conservation score for a k-mer position.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "example: get the average conservation score for the query k-mer at position 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.4650737963634926"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conservation_results.get_average_score(4, score_type='z_score')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``get_average_score`` function takes a ``position_mask`` as an optional argument that will only consider the conservation scores for the positions in the mask when calculating the average score. This is useful if you want to exclude certain positions from the average score calculation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: get the average conservation score for the query k-mer at position 0, but only consider the conservation scores for positions 1, and 3 within the k-mer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.197148283025409"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "position_mask = [0, 1, 0, 1, 0]\n",
    "conservation_results.get_average_score(0, score_type='z_score', position_mask=position_mask)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You could also do a weighted average from manually extracted conservation scores."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example: get the weighted average conservation score for the query k-mer at position 0 (using some arbitrary weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.31155698039226354"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.average(conservation_results.z_score_arr[0, :], weights=[0.1, 1, 0.5, 1, 10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Writing and Reading Results from Files"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can save the results to a file with ``write_results_to_file`` and load them back in with ``read_results_from_file``."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "example usage: save the results to a file and load them back in"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PairkConservation object\n",
       "222 query kmers x 23 orthologs\n",
       "kmer length - 5\n",
       "1110 background scores for z-score calculation\n",
       "222 kmers used for z-score calculation"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conservation_results.write_results_to_file('./conservation_results.npz')\n",
    "\n",
    "conservation_results.read_results_from_file('./conservation_results.npz')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# advanced customization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Step 1 and Step 2 can be modified, but this requires a bit of knowledge of the inner workings of the pairk package and the source code would have to be modified directly and probably installed in editable mode (see `Installation`_). If you want to modify the package, here's roughly how I organized the code in the ``pairk`` directory (the source code is available on [github](https://github.com/jacksonh1/pairk/). Below file paths are relative to the github repo root directory:\n",
    "\n",
    "* ``pairk/backend/`` - the main code for the package is located here. The main pairwise k-mer alignment and k-mer conservation functions are defined in files within this directory.\n",
    "* ``pairk/__init__.py`` - User-facing functions are imported into the main ``pairk/__init__.py`` file so that they are accessible when the package is imported. I think it also simplifies the import statements for users. Use this __init__ file to find where pairk's main functions are defined within the directory structure if you want to modify any of the functions above. You could also modify the __init__ file to make any new functions you create easy to access.\n",
    "* ``pairk/data/`` - data installed along with the package is stored here. This includes the scoring matrices and example data. The scoring matrices are stored in the ``pairk/data/matrices/`` folder.\n",
    "\n",
    "The easiest customization to make would be to add a new scoring matrix. To do this, you would add a new matrix file to the ``pairk/data/matrices/`` folder. The tools should be able to automatically find the matrix file and add it to the available scoring matrices. It will be named after the name of the file. Use ``pairk.print_available_matrices()`` to confirm (make sure you've installed pairk as an editable install for changes to take affect). You could then use the new matrix in relevant methods by passing the matrix name as an argument. If this doesn't work, you may need to modify the code that reads the matrices in the ``pairk/backend/tools/matrices.py`` file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34m../pairk/\u001b[0m\n",
      "├── \u001b[00m__init__.py\u001b[0m\n",
      "├── \u001b[00m_version.py\u001b[0m\n",
      "├── \u001b[01;34mbackend\u001b[0m\n",
      "│   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   ├── \u001b[01;34mconservation\u001b[0m\n",
      "│   │   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   │   ├── \u001b[01;34mcapra_singh_functions\u001b[0m\n",
      "│   │   │   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   │   │   └── \u001b[00mcapra_singh_2007_scores.py\u001b[0m\n",
      "│   │   └── \u001b[00mkmer_conservation.py\u001b[0m\n",
      "│   ├── \u001b[00mexceptions.py\u001b[0m\n",
      "│   ├── \u001b[01;34mkmer_alignment\u001b[0m\n",
      "│   │   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   │   ├── \u001b[00mesm_embedding_distance.py\u001b[0m\n",
      "│   │   ├── \u001b[00mneedleman_tools.py\u001b[0m\n",
      "│   │   ├── \u001b[00mscoring_matrix.py\u001b[0m\n",
      "│   │   └── \u001b[00mscoring_matrix_needleman.py\u001b[0m\n",
      "│   ├── \u001b[00mpairk_plotstyle.mplstyle\u001b[0m\n",
      "│   └── \u001b[01;34mtools\u001b[0m\n",
      "│       ├── \u001b[00m__init__.py\u001b[0m\n",
      "│       ├── \u001b[00mesm_tools.py\u001b[0m\n",
      "│       ├── \u001b[00mmatrices.py\u001b[0m\n",
      "│       ├── \u001b[00mpairwise_tools.py\u001b[0m\n",
      "│       ├── \u001b[00mplotting_tools.py\u001b[0m\n",
      "│       ├── \u001b[00mpssms.py\u001b[0m\n",
      "│       └── \u001b[00msequence_utils.py\u001b[0m\n",
      "├── \u001b[01;34mdata\u001b[0m\n",
      "│   ├── \u001b[00mREADME.md\u001b[0m\n",
      "│   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   ├── \u001b[00mexample_alignment_9606_0_00294e-idraln-555_to_971-idr-440_to_665.fasta\u001b[0m\n",
      "│   └── \u001b[01;34mmatrices\u001b[0m\n",
      "│       ├── \u001b[00mBLOSUM62\u001b[0m\n",
      "│       ├── \u001b[00mEDSSMat50\u001b[0m\n",
      "│       ├── \u001b[00m__init__.py\u001b[0m\n",
      "│       ├── \u001b[00mgrantham.csv\u001b[0m\n",
      "│       ├── \u001b[00mgrantham_similarity_norm.csv\u001b[0m\n",
      "│       └── \u001b[00mgrantham_similarity_normx100_aligner_compatible\u001b[0m\n",
      "├── \u001b[00mexamples.py\u001b[0m\n",
      "├── \u001b[00mpy.typed\u001b[0m\n",
      "├── \u001b[01;34msingle_kmer\u001b[0m\n",
      "│   └── \u001b[00m__init__.py\u001b[0m\n",
      "├── \u001b[01;34mtests\u001b[0m\n",
      "│   ├── \u001b[00m__init__.py\u001b[0m\n",
      "│   └── \u001b[00mtest_pairk.py\u001b[0m\n",
      "└── \u001b[00mutilities.py\u001b[0m\n",
      "\n",
      "10 directories, 36 files\n"
     ]
    }
   ],
   "source": [
    "!tree ../pairk/ -I __pycache__"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "formats": "ipynb,py:percent"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
